def compile_to_ir(self, func, DCE=False): """ Compile and return IR """ func_id = bytecode.FunctionIdentity.from_function(func) self.state.func_id = func_id ExtractByteCode().run_pass(self.state) state = self.state name = "DCE_testing" pm = PassManager(name) pm.add_pass(TranslateByteCode, "analyzing bytecode") pm.add_pass(FixupArgs, "fix up args") pm.add_pass(IRProcessing, "processing IR") pm.add_pass(NopythonTypeInference, "nopython frontend") if DCE is True: pm.add_pass(DeadCodeElimination, "DCE after typing") pm.finalize() pm.run(state) return state.func_ir
def run_pass(self, state): # run as subpipeline from numba.core.compiler_machinery import PassManager pm = PassManager("subpipeline") pm.add_pass(PartialTypeInference, "performs partial type inference") pm.finalize() pm.run(state) mutated = False func_ir = state.func_ir for block in func_ir.blocks.values(): for assign in block.find_insts(ir.Assign): binop = assign.value if not (isinstance(binop, ir.Expr) and binop.op == 'binop'): continue if self.is_dtype_comparison(func_ir, binop): var = func_ir.get_assignee(binop) typ = state.typemap.get(var.name, None) if isinstance(typ, types.BooleanLiteral): loc = binop.loc rhs = ir.Const(typ.literal_value, loc) new_assign = ir.Assign(rhs, var, loc) # replace instruction block.insert_after(new_assign, assign) block.remove(assign) mutated = True if mutated: pm = PassManager("subpipeline") # rewrite consts / dead branch pruning pm.add_pass(DeadCodeElimination, "dead code elimination") pm.add_pass(RewriteSemanticConstants, "rewrite semantic constants") pm.add_pass(DeadBranchPrune, "dead branch pruning") pm.finalize() pm.run(state) return mutated