Example #1
0
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)
Example #2
0
 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)
Example #3
0
 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)