diff --git a/loopy/check.py b/loopy/check.py index c31304d87494cbda2a15300b42c6503bceed53d1..5fb7a2fb928a26fd44fa0ff22598e71646853de6 100644 --- a/loopy/check.py +++ b/loopy/check.py @@ -822,12 +822,8 @@ def check_that_temporaries_are_defined_in_subkernels_where_used(kernel): # {{{ check that all instructions are scheduled def check_that_all_insns_are_scheduled(kernel): - from loopy.kernel.instruction import NoOpInstruction - all_schedulable_insns = set( - insn.id for insn in kernel.instructions - # nops are not schedulable - if not isinstance(insn, NoOpInstruction)) + all_schedulable_insns = set(insn.id for insn in kernel.instructions) from loopy.schedule import sched_item_to_insn_id scheduled_insns = set( insn_id diff --git a/loopy/codegen/instruction.py b/loopy/codegen/instruction.py index e590502fb5813af0a820d45228de8e11c35a46c8..5e0747246160ddc2934c3d545c03a2a9b4090d5d 100644 --- a/loopy/codegen/instruction.py +++ b/loopy/codegen/instruction.py @@ -75,7 +75,9 @@ def to_codegen_result( def generate_instruction_code(codegen_state, insn): kernel = codegen_state.kernel - from loopy.kernel.instruction import Assignment, CallInstruction, CInstruction + from loopy.kernel.instruction import ( + Assignment, CallInstruction, CInstruction, NoOpInstruction + ) if isinstance(insn, Assignment): ast = generate_assignment_instruction_code(codegen_state, insn) @@ -83,6 +85,8 @@ def generate_instruction_code(codegen_state, insn): ast = generate_call_code(codegen_state, insn) elif isinstance(insn, CInstruction): ast = generate_c_instruction_code(codegen_state, insn) + elif isinstance(insn, NoOpInstruction): + ast = generate_nop_instruction_code(codegen_state, insn) else: raise RuntimeError("unexpected instruction type") @@ -275,4 +279,10 @@ def generate_c_instruction_code(codegen_state, insn): return Block(body) +def generate_nop_instruction_code(codegen_state, insn): + if codegen_state.vectorization_info is not None: + raise Unvectorizable("C instructions cannot be vectorized") + return codegen_state.ast_builder.emit_comment( + "no-op (insn=%s)" % (insn.id)) + # vim: foldmethod=marker diff --git a/loopy/schedule/__init__.py b/loopy/schedule/__init__.py index 378a1c0bf8c08994abc54e87275678b9e353e719..fb0d0e2c17005ecf051d7034fd7903ed5262bdfc 100644 --- a/loopy/schedule/__init__.py +++ b/loopy/schedule/__init__.py @@ -1320,20 +1320,6 @@ def generate_loop_schedules_internal( # }}} -# {{{ filter nops from schedule - -def filter_nops_from_schedule(kernel, schedule): - from loopy.kernel.instruction import NoOpInstruction - return [ - sched_item - for sched_item in schedule - if (not isinstance(sched_item, RunInstruction) - or not isinstance(kernel.id_to_insn[sched_item.insn_id], - NoOpInstruction))] - -# }}} - - # {{{ convert barrier instructions to proper barriers def convert_barrier_instructions_to_barriers(kernel, schedule): @@ -1969,7 +1955,6 @@ def generate_loop_schedules_inner(kernel, debug_args={}): sched_state, debug=debug, **schedule_gen_kwargs): debug.stop() - gen_sched = filter_nops_from_schedule(kernel, gen_sched) gen_sched = convert_barrier_instructions_to_barriers( kernel, gen_sched)