def test_operands(self): m = Module.from_assembly(StringIO(self.test_module)) test_func = m.get_function_named("test_func") prod = m.get_function_named("prod") # test operands i1 = test_func.basic_blocks[0].instructions[0] i2 = test_func.basic_blocks[0].instructions[1] i3 = test_func.basic_blocks[0].instructions[2] i4 = test_func.basic_blocks[0].instructions[3] i5 = test_func.basic_blocks[0].instructions[4] self.assertEqual(i1.operand_count, 3) self.assertEqual(i2.operand_count, 2) self.assertEqual(i3.operands[1].z_ext_value, 1) self.assertEqual(i3.operands[1].s_ext_value, 1) self.assertEqual(i4.operands[1].z_ext_value, 0xffffffff) self.assertEqual(i4.operands[1].s_ext_value, -1) self.assertEqual(i5.operands[0].s_ext_value, -81985529216486895) self.assertEqual(i5.operands[1].z_ext_value, 12297829382473034410) self.assert_(i1.operands[-1] is prod) self.assert_(i1.operands[0] is test_func.args[0]) self.assert_(i1.operands[1] is test_func.args[1]) self.assert_(i2.operands[0] is i1) self.assert_(i2.operands[1] is test_func.args[2]) self.assertEqual(len(i1.operands), 3) self.assertEqual(len(i2.operands), 2) self.assert_(i1.called_function is prod)
def test_operands(self): m = Module.from_assembly(StringIO(self.test_module)) test_func = m.get_function_named("test_func") prod = m.get_function_named("prod") # test operands i1 = test_func.basic_blocks[0].instructions[0] i2 = test_func.basic_blocks[0].instructions[1] i3 = test_func.basic_blocks[0].instructions[2] i4 = test_func.basic_blocks[0].instructions[3] i5 = test_func.basic_blocks[0].instructions[4] self.assertEqual(i1.operand_count, 3) self.assertEqual(i2.operand_count, 2) self.assertEqual(i3.operands[1].z_ext_value, 1) self.assertEqual(i3.operands[1].s_ext_value, 1) self.assertEqual(i4.operands[1].z_ext_value, 0xffffffff) self.assertEqual(i4.operands[1].s_ext_value, -1) self.assertEqual(i5.operands[0].s_ext_value, -81985529216486895) self.assertEqual(i5.operands[1].z_ext_value, 12297829382473034410) self.assert_(i1.operands[-1] is prod) self.assert_(i1.operands[0] is test_func.args[0]) self.assert_(i1.operands[1] is test_func.args[1]) self.assert_(i2.operands[0] is i1) self.assert_(i2.operands[1] is test_func.args[2]) self.assertEqual(len(i1.operands), 3) self.assertEqual(len(i2.operands), 2) self.assert_(i1.called_function is prod)
def make_module(self): test_module = """ define i32 @sum(i32, i32) { entry: %2 = add i32 %0, %1 ret i32 %2 } """ return Module.from_assembly(StringIO(test_module))
def make_module(self): test_module = """ define void @sum(i32*, i32*) { entry: ret void } """ buf = StringIO(test_module) return Module.from_assembly(buf)
def make_module(self): test_module = """ define i32 @sum(i32, i32) { entry: %2 = add i32 %0, %1 ret i32 %2 } """ return Module.from_assembly(StringIO(test_module))
def make_module(self): test_module = """ define void @sum(i32*, i32*) { entry: ret void } """ buf = StringIO(test_module) return Module.from_assembly(buf)
def test_passes_with_pmb(self): m = Module.from_assembly(StringIO(self.asm)) fn_test1 = m.get_function_named('test1') fn_test2 = m.get_function_named('test2') original_test1 = str(fn_test1) original_test2 = str(fn_test2) # Try out the PassManagerBuilder pmb = lp.PassManagerBuilder.new() self.assertEqual(pmb.opt_level, 2) # ensure default is level 2 pmb.opt_level = 3 self.assertEqual(pmb.opt_level, 3) # make sure it works self.assertEqual(pmb.size_level, 0) # ensure default is level 0 pmb.size_level = 2 self.assertEqual(pmb.size_level, 2) # make sure it works self.assertFalse(pmb.vectorize) # ensure default is False pmb.vectorize = True self.assertTrue(pmb.vectorize) # make sure it works # make sure the default is False self.assertFalse(pmb.disable_unit_at_a_time) self.assertFalse(pmb.disable_unroll_loops) if llvm.version <= (3, 3): self.assertFalse(pmb.disable_simplify_lib_calls) pmb.disable_unit_at_a_time = True self.assertTrue(pmb.disable_unit_at_a_time) # Do function pass fpm = lp.FunctionPassManager.new(m) pmb.populate(fpm) fpm.run(fn_test1) # Make sure test1 has changed self.assertNotEqual(str(fn_test1).strip(), original_test1.strip()) # Do module pass pm = lp.PassManager.new() pmb.populate(pm) pm.run(m) # Make sure test2 has changed self.assertNotEqual(str(fn_test2).strip(), original_test2.strip())
def test_passes(self): m = Module.from_assembly(StringIO(self.asm)) fn_test1 = m.get_function_named('test1') fn_test2 = m.get_function_named('test2') original_test1 = str(fn_test1) original_test2 = str(fn_test2) # Let's run a module-level inlining pass. First, create a pass manager. pm = lp.PassManager.new() # Add the target data as the first "pass". This is mandatory. pm.add(le.TargetData.new('')) # Add the inlining pass. pm.add(lp.PASS_INLINE) # Run it! pm.run(m) # Done with the pass manager. del pm # Make sure test2 is inlined self.assertNotEqual(str(fn_test2).strip(), original_test2.strip()) bb_entry = fn_test2.basic_blocks[0] self.assertEqual(len(bb_entry.instructions), 1) self.assertEqual(bb_entry.instructions[0].opcode_name, 'ret') # Let's run a DCE pass on the the function 'test1' now. First create a # function pass manager. fpm = lp.FunctionPassManager.new(m) # Add the target data as first "pass". This is mandatory. fpm.add(le.TargetData.new('')) # Add a DCE pass fpm.add(lp.PASS_ADCE) # Run the pass on the function 'test1' fpm.run(m.get_function_named('test1')) # Make sure test1 is modified self.assertNotEqual(str(fn_test1).strip(), original_test1.strip())
def test_passes(self): m = Module.from_assembly(StringIO(self.asm)) fn_test1 = m.get_function_named("test1") fn_test2 = m.get_function_named("test2") original_test1 = str(fn_test1) original_test2 = str(fn_test2) # Let's run a module-level inlining pass. First, create a pass manager. pm = lp.PassManager.new() # Add the target data as the first "pass". This is mandatory. pm.add(le.TargetData.new("")) # Add the inlining pass. pm.add(lp.PASS_INLINE) # Run it! pm.run(m) # Done with the pass manager. del pm # Make sure test2 is inlined self.assertNotEqual(str(fn_test2).strip(), original_test2.strip()) bb_entry = fn_test2.basic_blocks[0] self.assertEqual(len(bb_entry.instructions), 1) self.assertEqual(bb_entry.instructions[0].opcode_name, "ret") # Let's run a DCE pass on the the function 'test1' now. First create a # function pass manager. fpm = lp.FunctionPassManager.new(m) # Add the target data as first "pass". This is mandatory. fpm.add(le.TargetData.new("")) # Add a DCE pass fpm.add(lp.PASS_ADCE) # Run the pass on the function 'test1' fpm.run(m.get_function_named("test1")) # Make sure test1 is modified self.assertNotEqual(str(fn_test1).strip(), original_test1.strip())
def test_asm_roundtrip(self): m = self.create_module() # write it's assembly representation to a file asm = str(m) testasm_ll = os.path.join(self.tmpdir, 'testasm.ll') with open(testasm_ll, "w") as fout: fout.write(asm) # read it back into a module with open(testasm_ll) as fin: m2 = Module.from_assembly(fin) # The default `m.id` is '<string>'. m2.id = m.id # Copy the name from `m` self.assertEqual(str(m2).strip(), asm.strip())
def test_asm_roundtrip(self): m = self.create_module() # write it's assembly representation to a file asm = str(m) testasm_ll = os.path.join(self.tmpdir, 'testasm.ll') with open(testasm_ll, "w") as fout: fout.write(asm) # read it back into a module with open(testasm_ll) as fin: m2 = Module.from_assembly(fin) # The default `m.id` is '<string>'. m2.id = m.id # Copy the name from `m` self.assertEqual(str(m2).strip(), asm.strip())
def test_asm(self): # create a module m = Module.new('module1') m.add_global_variable(Type.int(), 'i') # write it's assembly representation to a file asm = str(m) testasm_ll = os.path.join(self.tmpdir, 'testasm.ll') with open(testasm_ll, "w") as fout: fout.write(asm) # read it back into a module with open(testasm_ll) as fin: m2 = Module.from_assembly(fin) # The default `m.id` is '<string>'. m2.id = m.id # Copy the name from `m` self.assertEqual(str(m2).strip(), asm.strip())
def test_asm(self): # create a module m = Module.new("module1") m.add_global_variable(Type.int(), "i") # write it's assembly representation to a file asm = str(m) testasm_ll = os.path.join(self.tmpdir, "testasm.ll") with open(testasm_ll, "w") as fout: fout.write(asm) # read it back into a module with open(testasm_ll) as fin: m2 = Module.from_assembly(fin) # The default `m.id` is '<string>'. m2.id = m.id # Copy the name from `m` self.assertEqual(str(m2).strip(), asm.strip())
def test_operands(self): m = Module.from_assembly(StringIO(self.test_module)) test_func = m.get_function_named("test_func") prod = m.get_function_named("prod") # test operands i1 = test_func.basic_blocks[0].instructions[0] i2 = test_func.basic_blocks[0].instructions[1] self.assertEqual(i1.operand_count, 3) self.assertEqual(i2.operand_count, 2) self.assert_(i1.operands[-1] is prod) self.assert_(i1.operands[0] is test_func.args[0]) self.assert_(i1.operands[1] is test_func.args[1]) self.assert_(i2.operands[0] is i1) self.assert_(i2.operands[1] is test_func.args[2]) self.assertEqual(len(i1.operands), 3) self.assertEqual(len(i2.operands), 2)
def fromcpp(source): import tempfile, os, subprocess header = get_cpp_template() fid_cpp, name_cpp = tempfile.mkstemp(suffix='.cpp', text=True) os.write(fid_cpp, header + source) os.close(fid_cpp) args = ['clang','-S','-emit-llvm','-O3','-o','-',name_cpp] p1 = subprocess.Popen(args, stdout=subprocess.PIPE) assembly, err = p1.communicate() if err: raise RuntimeError("Error trying to compile", err) os.remove(name_cpp) llvm_module = Module.from_assembly(assembly) # Always get the first function --- # assume it is source # FIXME: We could improve this with an independent # parser of the source file func = llvm_module.functions[0] krnl = BlazeElementKernel(func) # Use default llvm dshapes -- # could improve this with a parser of source return krnl
def fromcpp(source): import tempfile, os, subprocess header = get_cpp_template() fid_cpp, name_cpp = tempfile.mkstemp(suffix='.cpp', text=True) os.write(fid_cpp, header + source) os.close(fid_cpp) args = ['clang', '-S', '-emit-llvm', '-O3', '-o', '-', name_cpp] p1 = subprocess.Popen(args, stdout=subprocess.PIPE) assembly, err = p1.communicate() if err: raise RuntimeError("Error trying to compile", err) os.remove(name_cpp) llvm_module = Module.from_assembly(assembly) # Always get the first function --- # assume it is source # FIXME: We could improve this with an independent # parser of the source file func = llvm_module.functions[0] krnl = BlazeElementKernel(func) # Use default llvm dshapes -- # could improve this with a parser of source return krnl