diff --git a/loopy/preprocess.py b/loopy/preprocess.py index 027e98ae51c7992f98c7ab22f6574259bbca00c8..f93ea891fd7f1aa420c8c109c31b50fd8305a9e3 100644 --- a/loopy/preprocess.py +++ b/loopy/preprocess.py @@ -72,6 +72,24 @@ def prepare_for_caching(kernel): # }}} +# {{{ check for writes to predicates + +def check_for_writes_to_predicates(kernel): + from loopy.symbolic import get_dependencies + for insn in kernel.instructions: + pred_vars = ( + frozenset.union( + *(get_dependencies(pred) for pred in insn.predicates)) + if insn.predicates else frozenset()) + written_pred_vars = frozenset(insn.assignee_var_names()) & pred_vars + if written_pred_vars: + raise LoopyError("In instruction '%s': may not write to " + "variable(s) '%s' involved in the instruction's predicates" + % (insn.id, ", ".join(written_pred_vars))) + +# }}} + + # {{{ check reduction iname uniqueness def check_reduction_iname_uniqueness(kernel): @@ -876,6 +894,7 @@ def preprocess_kernel(kernel, device=None): kernel = infer_unknown_types(kernel, expect_completion=False) + check_for_writes_to_predicates(kernel) check_reduction_iname_uniqueness(kernel) from loopy.kernel.creation import apply_single_writer_depencency_heuristic