From 4468ddf8f8edb5cd51e708ee623598bc6d0716de Mon Sep 17 00:00:00 2001 From: Joshua Huelsman Date: Mon, 9 Mar 2020 03:21:08 -0400 Subject: [PATCH] LLVM: speed improvement changes. --- src/llvm_backend.cpp | 60 +++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 29 deletions(-) diff --git a/src/llvm_backend.cpp b/src/llvm_backend.cpp index 3b3fe4985..36b13d4f2 100644 --- a/src/llvm_backend.cpp +++ b/src/llvm_backend.cpp @@ -10157,6 +10157,33 @@ void lb_generate_code(lbGenerator *gen) { auto *min_dep_set = &info->minimum_dependency_set; + TIME_SECTION("LLVM Initializtion"); + + LLVMInitializeAllTargetInfos(); + LLVMInitializeAllTargets(); + LLVMInitializeAllTargetMCs(); + LLVMInitializeAllAsmPrinters(); + LLVMInitializeAllAsmParsers(); + LLVMInitializeAllDisassemblers(); + LLVMInitializeNativeTarget(); + + + char const *target_triple = "x86_64-pc-windows-msvc"; + char const *target_data_layout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"; + LLVMSetTarget(mod, target_triple); + + LLVMTargetRef target = {}; + char *llvm_error = nullptr; + LLVMGetTargetFromTriple(target_triple, &target, &llvm_error); + GB_ASSERT(target != nullptr); + + TIME_SECTION("LLVM Create Target Machine"); + + LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelDefault); + defer (LLVMDisposeTargetMachine(target_machine)); + + LLVMSetModuleDataLayout(mod, LLVMCreateTargetDataLayout(target_machine)); + { // Debug Info for_array(i, info->files.entries) { AstFile *f = info->files.entries[i].value; @@ -10467,9 +10494,10 @@ void lb_generate_code(lbGenerator *gen) { LLVMPassManagerRef function_pass_manager = LLVMCreateFunctionPassManagerForModule(mod); defer (LLVMDisposePassManager(function_pass_manager)); + LLVMAddMemCpyOptPass(function_pass_manager); LLVMAddPromoteMemoryToRegisterPass(function_pass_manager); LLVMAddMergedLoadStoreMotionPass(function_pass_manager); - LLVMAddDeadStoreEliminationPass(function_pass_manager); + // LLVMAddDeadStoreEliminationPass(function_pass_manager); LLVMAddAggressiveInstCombinerPass(function_pass_manager); LLVMAddConstantPropagationPass(function_pass_manager); LLVMAddAggressiveDCEPass(function_pass_manager); @@ -10595,6 +10623,7 @@ void lb_generate_code(lbGenerator *gen) { defer (LLVMDisposePassManager(module_pass_manager)); LLVMAddAlwaysInlinerPass(module_pass_manager); LLVMAddStripDeadPrototypesPass(module_pass_manager); + // LLVMAddConstantMergePass(module_pass_manager); LLVMPassManagerBuilderRef pass_manager_builder = LLVMPassManagerBuilderCreate(); defer (LLVMPassManagerBuilderDispose(pass_manager_builder)); @@ -10604,10 +10633,7 @@ void lb_generate_code(lbGenerator *gen) { LLVMPassManagerBuilderPopulateLTOPassManager(pass_manager_builder, module_pass_manager, false, false); LLVMRunPassManager(module_pass_manager, mod); - - - - char *llvm_error = nullptr; + llvm_error = nullptr; defer (LLVMDisposeMessage(llvm_error)); String filepath_ll = concatenate_strings(heap_allocator(), gen->output_base, STR_LIT(".ll")); @@ -10624,30 +10650,6 @@ void lb_generate_code(lbGenerator *gen) { LLVMVerifyModule(mod, LLVMAbortProcessAction, &llvm_error); llvm_error = nullptr; - TIME_SECTION("LLVM Initializtion"); - - LLVMInitializeAllTargetInfos(); - LLVMInitializeAllTargets(); - LLVMInitializeAllTargetMCs(); - LLVMInitializeAllAsmPrinters(); - LLVMInitializeAllAsmParsers(); - LLVMInitializeAllDisassemblers(); - LLVMInitializeNativeTarget(); - - - char const *target_triple = "x86_64-pc-windows-msvc"; - char const *target_data_layout = "e-m:w-i64:64-f80:128-n8:16:32:64-S128"; - LLVMSetTarget(mod, target_triple); - - LLVMTargetRef target = {}; - LLVMGetTargetFromTriple(target_triple, &target, &llvm_error); - GB_ASSERT(target != nullptr); - - TIME_SECTION("LLVM Create Target Machine"); - - LLVMTargetMachineRef target_machine = LLVMCreateTargetMachine(target, target_triple, "generic", "", LLVMCodeGenLevelNone, LLVMRelocDefault, LLVMCodeModelDefault); - defer (LLVMDisposeTargetMachine(target_machine)); - TIME_SECTION("LLVM Object Generation"); LLVMBool ok = LLVMTargetMachineEmitToFile(target_machine, mod, cast(char *)filepath_obj.text, LLVMObjectFile, &llvm_error);