def fix_powi_calls(mod): """Replace llvm.powi.f64 intrinsic because we don't have compiler-rt. """ orig = mod.globals.get('llvm.powi.f64') if orig is not None: # Build a wrapper function for powi() to re-direct the intrinsic call # to pow(). powinstr = mod.declare_intrinsic('llvm.pow', [ir.DoubleType()]) repl = ir.Function(mod, orig.function_type, name=".numba.powi_fix") repl.linkage = 'internal' builder = ir.IRBuilder(repl.append_basic_block()) base, power = repl.args power = builder.sitofp(power, ir.DoubleType()) call = builder.call(powinstr, [base, power]) builder.ret(call) # Replace all calls in the module ir.replace_all_calls(mod, orig, repl)
def test_call_transform(self): mod = ir.Module() foo = ir.Function(mod, ir.FunctionType(ir.VoidType(), ()), "foo") bar = ir.Function(mod, ir.FunctionType(ir.VoidType(), ()), "bar") builder = ir.IRBuilder() builder.position_at_end(foo.append_basic_block()) call = builder.call(foo, ()) self.assertEqual(call.callee, foo) modified = ir.replace_all_calls(mod, foo, bar) self.assertIn(call, modified) self.assertNotEqual(call.callee, foo) self.assertEqual(call.callee, bar)