def _pass_manager_builder(self): """ Create a PassManagerBuilder. Note: a PassManagerBuilder seems good only for one use, so you should call this method each time you want to populate a module or function pass manager. Otherwise some optimizations will be missed... """ pmb = lp.create_pass_manager_builder(opt=config.OPT, loop_vectorize=config.LOOP_VECTORIZE) return pmb
def _pass_manager_builder(self): """ Create a PassManagerBuilder. Note: a PassManagerBuilder seems good only for one use, so you should call this method each time you want to populate a module or function pass manager. Otherwise some optimizations will be missed... """ pmb = lp.create_pass_manager_builder( opt=config.OPT, loop_vectorize=config.LOOP_VECTORIZE) return pmb
def _pass_manager_builder(self, **kwargs): """ Create a PassManagerBuilder. Note: a PassManagerBuilder seems good only for one use, so you should call this method each time you want to populate a module or function pass manager. Otherwise some optimizations will be missed... """ opt_level = kwargs.pop('opt', config.OPT) loop_vectorize = kwargs.pop('loop_vectorize', config.LOOP_VECTORIZE) slp_vectorize = kwargs.pop('slp_vectorize', config.SLP_VECTORIZE) pmb = lp.create_pass_manager_builder(opt=opt_level, loop_vectorize=loop_vectorize, slp_vectorize=slp_vectorize, **kwargs) return pmb
def jit(self, name, *args, optimize=False, llvmdump=True): if llvmdump: print('======== Unoptimized LLVM IR') print(str(self.codegen.module)) llvmmod = llvm.parse_assembly(str(self.codegen.module)) target_machine = self.target.create_target_machine(opt=3) if optimize: pmb = lp.create_pass_manager_builder(opt=2) pm = llvm.create_module_pass_manager() pmb.populate(pm) pm.run(llvmmod) if llvmdump: print('======== Optimized LLVM IR') print(str(llvmmod)) with llvm.create_mcjit_compiler(llvmmod, target_machine) as ee: ee.finalize_object() fptr = CFUNCTYPE(c_int)(ee.get_function_address(name)) result = fptr(*args) return result