diff --git a/loopy/kernel/creation.py b/loopy/kernel/creation.py index 2495e4f3d0f8eacda0ee539408bb3c2a7e17bbcf..5427d96cae18bbf7e85b2837353e924bf5c2837b 100644 --- a/loopy/kernel/creation.py +++ b/loopy/kernel/creation.py @@ -695,7 +695,7 @@ def parse_instructions(instructions, defines): # {{{ pass 4: parsing insn_options_stack = [get_default_insn_options_dict()] - if_predicates_stack = [{'predicates' : frozenset()}] + if_predicates_stack = [{'predicates' : frozenset(), 'insn_predicates' : frozenset()}] for insn in instructions: if isinstance(insn, InstructionBase): @@ -841,6 +841,8 @@ def parse_instructions(instructions, defines): | additional_preds ) if_options["predicates"] = additional_preds + #hold on to this for comparison / stack popping later + if_options["insn_predicates"] = options["predicates"] insn_options_stack.append(options) if_predicates_stack.append(if_options) @@ -852,7 +854,10 @@ def parse_instructions(instructions, defines): continue if insn == "end": - insn_options_stack.pop() + obj = insn_options_stack.pop() + #if this object is the end of an if statement + if obj['predicates'] == if_predicates_stack[-1]["insn_predicates"]: + if_predicates_stack.pop() continue insn_match = SPECIAL_INSN_RE.match(insn)