Merge "Split the libbcc pass manager into two phases."
diff --git a/lib/Core/Compiler.cpp b/lib/Core/Compiler.cpp
index 71c0ed2..eea0750 100644
--- a/lib/Core/Compiler.cpp
+++ b/lib/Core/Compiler.cpp
@@ -148,69 +148,77 @@
enum Compiler::ErrorCode Compiler::runPasses(Script &pScript,
llvm::raw_pwrite_stream &pResult) {
// Pass manager for link-time optimization
- llvm::legacy::PassManager passes;
+ llvm::legacy::PassManager transformPasses;
// Empty MCContext.
llvm::MCContext *mc_context = nullptr;
- passes.add(createTargetTransformInfoWrapperPass(mTarget->getTargetIRAnalysis()));
+ transformPasses.add(
+ createTargetTransformInfoWrapperPass(mTarget->getTargetIRAnalysis()));
// Add some initial custom passes.
- addInvokeHelperPass(passes);
- addExpandKernelPass(passes);
- addInvariantPass(passes);
- if (!addInternalizeSymbolsPass(pScript, passes))
+ addInvokeHelperPass(transformPasses);
+ addExpandKernelPass(transformPasses);
+ addInvariantPass(transformPasses);
+ if (!addInternalizeSymbolsPass(pScript, transformPasses))
return kErrCustomPasses;
- addGlobalInfoPass(pScript, passes);
+ addGlobalInfoPass(pScript, transformPasses);
if (mTarget->getOptLevel() == llvm::CodeGenOpt::None) {
- passes.add(llvm::createGlobalOptimizerPass());
- passes.add(llvm::createConstantMergePass());
+ transformPasses.add(llvm::createGlobalOptimizerPass());
+ transformPasses.add(llvm::createConstantMergePass());
} else {
// FIXME: Figure out which passes should be executed.
llvm::PassManagerBuilder Builder;
Builder.Inliner = llvm::createFunctionInliningPass();
- Builder.populateLTOPassManager(passes);
+ Builder.populateLTOPassManager(transformPasses);
/* FIXME: Reenable autovectorization after rebase.
bug 19324423
// Add vectorization passes after LTO passes are in
// additional flag: -unroll-runtime
- passes.add(llvm::createLoopUnrollPass(-1, 16, 0, 1));
+ transformPasses.add(llvm::createLoopUnrollPass(-1, 16, 0, 1));
// Need to pass appropriate flags here: -scalarize-load-store
- passes.add(llvm::createScalarizerPass());
- passes.add(llvm::createCFGSimplificationPass());
- passes.add(llvm::createScopedNoAliasAAPass());
- passes.add(llvm::createScalarEvolutionAliasAnalysisPass());
+ transformPasses.add(llvm::createScalarizerPass());
+ transformPasses.add(llvm::createCFGSimplificationPass());
+ transformPasses.add(llvm::createScopedNoAliasAAPass());
+ transformPasses.add(llvm::createScalarEvolutionAliasAnalysisPass());
// additional flags: -slp-vectorize-hor -slp-vectorize-hor-store (unnecessary?)
- passes.add(llvm::createSLPVectorizerPass());
- passes.add(llvm::createDeadCodeEliminationPass());
- passes.add(llvm::createInstructionCombiningPass());
+ transformPasses.add(llvm::createSLPVectorizerPass());
+ transformPasses.add(llvm::createDeadCodeEliminationPass());
+ transformPasses.add(llvm::createInstructionCombiningPass());
*/
}
// These passes have to come after LTO, since we don't want to examine
// functions that are never actually called.
if (llvm::Triple(getTargetMachine().getTargetTriple()).getArch() == llvm::Triple::x86_64)
- passes.add(createRSX86_64CallConvPass()); // Add pass to correct calling convention for X86-64.
- passes.add(createRSIsThreadablePass()); // Add pass to mark script as threadable.
+ transformPasses.add(createRSX86_64CallConvPass()); // Add pass to correct calling convention for X86-64.
+ transformPasses.add(createRSIsThreadablePass()); // Add pass to mark script as threadable.
// RSEmbedInfoPass needs to come after we have scanned for non-threadable
// functions.
// Script passed to RSCompiler must be a RSScript.
RSScript &script = static_cast<RSScript &>(pScript);
if (script.getEmbedInfo())
- passes.add(createRSEmbedInfoPass());
+ transformPasses.add(createRSEmbedInfoPass());
+
+ // Execute the passes.
+ transformPasses.run(pScript.getSource().getModule());
+
+ // Run backend separately to avoid interference between debug metadata
+ // generation and backend initialization.
+ llvm::legacy::PassManager codeGenPasses;
// Add passes to the pass manager to emit machine code through MC layer.
- if (mTarget->addPassesToEmitMC(passes, mc_context, pResult,
+ if (mTarget->addPassesToEmitMC(codeGenPasses, mc_context, pResult,
/* DisableVerify */false)) {
return kPrepareCodeGenPass;
}
// Execute the passes.
- passes.run(pScript.getSource().getModule());
+ codeGenPasses.run(pScript.getSource().getModule());
return kSuccess;
}