def optimize(self, llmodule): llpassmgr = llvm.create_module_pass_manager() # Register our alias analysis passes. llpassmgr.add_basic_alias_analysis_pass() llpassmgr.add_type_based_alias_analysis_pass() # Start by cleaning up after our codegen and exposing as much # information to LLVM as possible. llpassmgr.add_constant_merge_pass() llpassmgr.add_cfg_simplification_pass() llpassmgr.add_instruction_combining_pass() llpassmgr.add_sroa_pass() llpassmgr.add_dead_code_elimination_pass() llpassmgr.add_function_attrs_pass() llpassmgr.add_global_optimizer_pass() # Now, actually optimize the code. llpassmgr.add_function_inlining_pass(275) llpassmgr.add_ipsccp_pass() llpassmgr.add_instruction_combining_pass() llpassmgr.add_gvn_pass() llpassmgr.add_cfg_simplification_pass() llpassmgr.add_licm_pass() # Clean up after optimizing. llpassmgr.add_dead_arg_elimination_pass() llpassmgr.add_global_dce_pass() llpassmgr.run(llmodule)
def finalize(self): self.llvm_module_ref = llvm.parse_assembly(str(self.llvm_module)) pmb = llvm.create_pass_manager_builder() pmb.opt_level = 2 pm = llvm.create_module_pass_manager() pmb.populate(pm) pm.run(self.llvm_module_ref)
def compile(self, module): """Compile the module to a relocatable object for this target.""" if os.getenv("ARTIQ_DUMP_SIG"): print("====== MODULE_SIGNATURE DUMP ======", file=sys.stderr) print(module, file=sys.stderr) if os.getenv("ARTIQ_DUMP_IR"): print("====== ARTIQ IR DUMP ======", file=sys.stderr) type_printer = types.TypePrinter() for function in module.artiq_ir: print(function.as_entity(type_printer), file=sys.stderr) llmod = module.build_llvm_ir(self) try: llparsedmod = llvm.parse_assembly(str(llmod)) llparsedmod.verify() except RuntimeError: print("====== LLVM IR DUMP (PARSE FAILED) ======", file=sys.stderr) print(str(llmod), file=sys.stderr) raise if os.getenv("ARTIQ_DUMP_LLVM"): print("====== LLVM IR DUMP ======", file=sys.stderr) print(str(llparsedmod), file=sys.stderr) llpassmgrbuilder = llvm.create_pass_manager_builder() llpassmgrbuilder.opt_level = 2 # -O2 llpassmgrbuilder.size_level = 1 # -Os llpassmgrbuilder.inlining_threshold = 75 # -Os threshold llpassmgr = llvm.create_module_pass_manager() llpassmgrbuilder.populate(llpassmgr) llpassmgr.run(llparsedmod) if os.getenv("ARTIQ_DUMP_LLVM"): print("====== LLVM IR DUMP (OPTIMIZED) ======", file=sys.stderr) print(str(llparsedmod), file=sys.stderr) lltarget = llvm.Target.from_triple(self.triple) llmachine = lltarget.create_target_machine( features=",".join(["+{}".format(f) for f in self.features]), reloc="pic", codemodel="default") if os.getenv("ARTIQ_DUMP_ASSEMBLY"): print("====== ASSEMBLY DUMP ======", file=sys.stderr) print(llmachine.emit_assembly(llparsedmod), file=sys.stderr) return llmachine.emit_object(llparsedmod)
def compile(self, module): """Compile the module to a relocatable object for this target.""" if os.getenv("ARTIQ_DUMP_SIG"): print("====== MODULE_SIGNATURE DUMP ======", file=sys.stderr) print(module, file=sys.stderr) type_printer = types.TypePrinter() _dump(os.getenv("ARTIQ_DUMP_IR"), "ARTIQ IR", ".txt", lambda: "\n".join(fn.as_entity(type_printer) for fn in module.artiq_ir)) llmod = module.build_llvm_ir(self) try: llparsedmod = llvm.parse_assembly(str(llmod)) llparsedmod.verify() except RuntimeError: _dump("", "LLVM IR (broken)", ".ll", lambda: str(llmod)) raise _dump(os.getenv("ARTIQ_DUMP_UNOPT_LLVM"), "LLVM IR (generated)", "_unopt.ll", lambda: str(llparsedmod)) llpassmgrbuilder = llvm.create_pass_manager_builder() llpassmgrbuilder.opt_level = 2 # -O2 llpassmgrbuilder.size_level = 1 # -Os llpassmgrbuilder.inlining_threshold = 75 # -Os threshold llpassmgr = llvm.create_module_pass_manager() llpassmgrbuilder.populate(llpassmgr) llpassmgr.run(llparsedmod) _dump(os.getenv("ARTIQ_DUMP_LLVM"), "LLVM IR (optimized)", ".ll", lambda: str(llparsedmod)) return llparsedmod