X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=tools%2Flto2%2FLTOCodeGenerator.cpp;h=5b7a067b4c389cf4400cac14e12f5eedbc8f9781;hb=95df6b3603e228cea714be21997fec82cb03011e;hp=ae97694a9204736f54479ff51644376d950ec421;hpb=00481ed5db48ca7cdfc165fb94781017def18717;p=oota-llvm.git diff --git a/tools/lto2/LTOCodeGenerator.cpp b/tools/lto2/LTOCodeGenerator.cpp index ae97694a920..5b7a067b4c3 100644 --- a/tools/lto2/LTOCodeGenerator.cpp +++ b/tools/lto2/LTOCodeGenerator.cpp @@ -32,6 +32,7 @@ #include "llvm/Analysis/Verifier.h" #include "llvm/Analysis/LoadValueNumbering.h" #include "llvm/CodeGen/FileWriters.h" +#include "llvm/Target/SubtargetFeature.h" #include "llvm/Target/TargetOptions.h" #include "llvm/Target/TargetData.h" #include "llvm/Target/TargetMachine.h" @@ -261,8 +262,11 @@ bool LTOCodeGenerator::determineTarget(std::string& errMsg) *mergedModule, errMsg); if ( march == NULL ) return true; - std::string features; - _target = march->CtorFn(*mergedModule, features); + + // construct LTModule, hand over ownership of module and target + std::string FeatureStr = + getFeatureString(_linker.getModule()->getTargetTriple().c_str()); + _target = march->CtorFn(*mergedModule, FeatureStr.c_str()); } return false; } @@ -302,7 +306,6 @@ void LTOCodeGenerator::applyScopeRestrictions() } } - /// Optimize merged modules using various IPO passes bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errMsg) { @@ -352,19 +355,17 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM // keep one copy of each constant... passes.add(createConstantMergePass()); - // If the -s command line option was specified, strip the symbols out of the - // resulting program to make it smaller. -s is a GLD option that we are - // supporting. - passes.add(createStripSymbolsPass()); - // Remove unused arguments from functions... passes.add(createDeadArgEliminationPass()); - passes.add(createFunctionInliningPass()); // Inline small functions - - passes.add(createPruneEHPass()); // Remove dead EH info - - passes.add(createGlobalDCEPass()); // Remove dead functions + // Reduce the code after globalopt and ipsccp. Both can open up significant + // simplification opportunities, and both can propagate functions through + // function pointers. When this happens, we often have to resolve varargs + // calls, etc, so let instcombine do this. + passes.add(createInstructionCombiningPass()); + passes.add(createFunctionInliningPass()); // Inline small functions + passes.add(createPruneEHPass()); // Remove dead EH info + passes.add(createGlobalDCEPass()); // Remove dead functions // If we didn't decide to inline a function, check to see if we can // transform it to pass arguments by value instead of by reference. @@ -376,16 +377,14 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM passes.add(createScalarReplAggregatesPass()); // Break up allocas // Run a few AA driven optimizations here and now, to cleanup the code. - passes.add(createGlobalsModRefPass()); // IP alias analysis - - passes.add(createLICMPass()); // Hoist loop invariants - passes.add(createGVNPass()); // Remove common subexprs - passes.add(createMemCpyOptPass()); // Remove dead memcpy's + passes.add(createGlobalsModRefPass()); // IP alias analysis + passes.add(createLICMPass()); // Hoist loop invariants + passes.add(createGVNPass()); // Remove common subexprs + passes.add(createMemCpyOptPass()); // Remove dead memcpy's passes.add(createDeadStoreEliminationPass()); // Nuke dead stores // Cleanup and simplify the code after the scalar optimizations. passes.add(createInstructionCombiningPass()); - passes.add(createJumpThreadingPass()); // Thread jumps. // Delete basic blocks, which optimization passes may have killed... @@ -430,13 +429,13 @@ bool LTOCodeGenerator::generateAssemblyCode(std::ostream& out, std::string& errM // Run the code generator, and write assembly file codeGenPasses->doInitialization(); - for (Module::iterator it = mergedModule->begin(), - e = mergedModule->end(); it != e; ++it) { - if (!it->isDeclaration()) - codeGenPasses->run(*it); - } - codeGenPasses->doFinalization(); + for (Module::iterator + it = mergedModule->begin(), e = mergedModule->end(); it != e; ++it) + if (!it->isDeclaration()) + codeGenPasses->run(*it); + + codeGenPasses->doFinalization(); return false; // success }