Add clang-cc support for -disable-llvm-optzns.

- Avoids running any LLVM optimizations, even at -O2, etc., while still keeping
   any language changes these optimizations imply.

llvm-svn: 72742
This commit is contained in:
Daniel Dunbar 2009-06-02 22:07:45 +00:00
parent 136bd719f0
commit 4b665ebb01
4 changed files with 62 additions and 11 deletions

View File

@ -23,12 +23,17 @@ namespace clang {
/// is optimized and passed to the backend.
class CompileOptions {
public:
enum InliningMethod {
NoInlining, // Perform no inlining whatsoever.
NormalInlining, // Use the standard function inlining pass.
OnlyAlwaysInlining // Only run the always inlining pass.
};
unsigned OptimizationLevel : 3; /// The -O[0-4] option specified.
unsigned OptimizeSize : 1; /// If -Os is specified.
unsigned DebugInfo : 1; /// Should generate deubg info (-g).
unsigned UnitAtATime : 1; /// Unused. For mirroring GCC
/// optimization selection.
unsigned InlineFunctions : 1; /// Should functions be inlined?
unsigned SimplifyLibCalls : 1; /// Should standard library calls be
/// treated specially.
unsigned UnrollLoops : 1; /// Control whether loops are unrolled.
@ -37,6 +42,9 @@ public:
unsigned TimePasses : 1; /// Set when -ftime-report is enabled.
unsigned NoCommon : 1; /// Set when -fno-common or C++ is enabled.
/// Inlining - The kind of inlining to perform.
InliningMethod Inlining;
/// CPU - An optional CPU to target.
std::string CPU;
@ -50,10 +58,11 @@ public:
OptimizeSize = 0;
DebugInfo = 0;
UnitAtATime = 1;
InlineFunctions = SimplifyLibCalls = UnrollLoops = 0;
SimplifyLibCalls = UnrollLoops = 0;
VerifyModule = 1;
TimePasses = 0;
NoCommon = 0;
Inlining = NoInlining;
}
};

View File

@ -294,10 +294,16 @@ void BackendConsumer::CreatePasses() {
PM->add(createPruneEHPass()); // Remove dead EH info
PM->add(createFunctionAttrsPass()); // Set readonly/readnone attrs
}
if (CompileOpts.InlineFunctions)
switch (CompileOpts.Inlining) {
case CompileOptions::NoInlining:
break;
case CompileOptions::NormalInlining:
PM->add(createFunctionInliningPass()); // Inline small functions
else
break;
case CompileOptions::OnlyAlwaysInlining:
PM->add(createAlwaysInlinerPass()); // Respect always_inline
break;
}
if (CompileOpts.OptimizationLevel > 2)
PM->add(createArgumentPromotionPass()); // Scalarize uninlined fn args
if (CompileOpts.SimplifyLibCalls)
@ -341,7 +347,16 @@ void BackendConsumer::CreatePasses() {
if (CompileOpts.OptimizationLevel > 1 && CompileOpts.UnitAtATime)
PM->add(createConstantMergePass()); // Merge dup global constants
} else {
PM->add(createAlwaysInlinerPass());
switch (CompileOpts.Inlining) {
case CompileOptions::NoInlining:
break;
case CompileOptions::NormalInlining:
PM->add(createFunctionInliningPass()); // Inline small functions
break;
case CompileOptions::OnlyAlwaysInlining:
PM->add(createAlwaysInlinerPass()); // Respect always_inline
break;
}
}
}

View File

@ -0,0 +1,13 @@
// RUN: clang-cc -emit-llvm -o %t %s &&
// RUN: grep '@f0' %t | count 0 &&
// RUN: clang-cc -disable-llvm-optzns -emit-llvm -o %t %s &&
// RUN: grep '@f0' %t | count 2
//static int f0() {
static int __attribute__((always_inline)) f0() {
return 1;
}
int f1() {
return f0();
}

View File

@ -666,6 +666,10 @@ DollarsInIdents("fdollars-in-identifiers",
static llvm::cl::opt<bool>
OptSize("Os", llvm::cl::desc("Optimize for size"));
static llvm::cl::opt<bool>
DisableLLVMOptimizations("disable-llvm-optzns",
llvm::cl::desc("Don't run LLVM optimization passes"));
static llvm::cl::opt<bool>
NoCommon("fno-common",
llvm::cl::desc("Compile common globals like normal definitions"),
@ -1420,16 +1424,26 @@ static void InitializeCompileOptions(CompileOptions &Opts,
const llvm::StringMap<bool> &Features) {
Opts.OptimizeSize = OptSize;
Opts.DebugInfo = GenerateDebugInfo;
if (OptSize) {
// -Os implies -O2
// FIXME: Diagnose conflicting options.
Opts.OptimizationLevel = 2;
if (DisableLLVMOptimizations) {
Opts.OptimizationLevel = 0;
Opts.Inlining = CompileOptions::NoInlining;
} else {
Opts.OptimizationLevel = OptLevel;
if (OptSize) {
// -Os implies -O2
Opts.OptimizationLevel = 2;
} else {
Opts.OptimizationLevel = OptLevel;
}
// We must always run at least the always inlining pass.
if (Opts.OptimizationLevel > 1)
Opts.Inlining = CompileOptions::NormalInlining;
else
Opts.Inlining = CompileOptions::OnlyAlwaysInlining;
}
// FIXME: There are llvm-gcc options to control these selectively.
Opts.InlineFunctions = (Opts.OptimizationLevel > 1);
Opts.UnrollLoops = (Opts.OptimizationLevel > 1 && !OptSize);
Opts.SimplifyLibCalls = !LangOpts.NoBuiltin;