Hi kcc, chandlerc,
This change makes something like 20-30% speed improvement.
MSan generates very complex instrumentation, nearly mirroring the original code
logic, but with many inputs replaced by constant values. This leave huge
optimization opportunities.
This change also puts additional stress on MSan pass. As things are now, MSan
is the last pass in the optimization chain, and, as such, can get away with
generating somewhat broken code (ex. messed up readonly function attributes;
also see the recent change that translate memcpy instrinsic into
__msan_memcpy; there are more pending changes that have no effect without this).
I'm adding new optimizations under -O2 AND fsanitize=memory, without another
flag.
Do you think we should to empirically minimize this set of optimizations? I'm
not sure if we've got good enough all-round benchmark suite, and we could miss
something important.
This code adds ~20% compilation time (only with msan and -O2), and ~30% runtime
perf.
http://llvm-reviews.chandlerc.com/D189
Files:
llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
Index: llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
===================================================================
--- llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
+++ llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
@@ -188,6 +188,34 @@
static void addMemorySanitizerPass(const PassManagerBuilder &Builder,
PassManagerBase &PM) {
PM.add(createMemorySanitizerPass());
+ if (Builder.OptLevel > 1) {
+ PM.add(createEarlyCSEPass()); // Catch trivial redundancies
+ PM.add(createJumpThreadingPass()); // Thread jumps.
+ PM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
+ PM.add(createCFGSimplificationPass()); // Merge & remove BBs
+ PM.add(createInstructionCombiningPass()); // Combine silly seq's
+
+ PM.add(createTailCallEliminationPass()); // Eliminate tail calls
+ PM.add(createCFGSimplificationPass()); // Merge & remove BBs
+ PM.add(createReassociatePass()); // Reassociate expressions
+ PM.add(createLoopRotatePass()); // Rotate Loop
+ PM.add(createLICMPass()); // Hoist loop invariants
+ PM.add(createInstructionCombiningPass());
+ PM.add(createIndVarSimplifyPass()); // Canonicalize indvars
+ PM.add(createLoopIdiomPass()); // Recognize idioms like memset.
+ PM.add(createLoopDeletionPass()); // Delete dead loops
+
+ PM.add(createGVNPass()); // Remove redundancies
+ PM.add(createMemCpyOptPass()); // Remove memcpy / form memset
+ PM.add(createSCCPPass()); // Constant prop with SCCP
+
+ // Run instcombine after redundancy elimination to exploit opportunities
+ // opened up by them.
+ PM.add(createInstructionCombiningPass());
+ PM.add(createJumpThreadingPass()); // Thread jumps
+ PM.add(createCorrelatedValuePropagationPass());
+ PM.add(createDeadStoreEliminationPass()); // Delete dead stores
+ }
}
static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
Index: llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
===================================================================
--- llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
+++ llvm/tools/clang/lib/CodeGen/BackendUtil.cpp
@@ -188,6 +188,34 @@
static void addMemorySanitizerPass(const PassManagerBuilder &Builder,
PassManagerBase &PM) {
PM.add(createMemorySanitizerPass());
+ if (Builder.OptLevel > 1) {
+ PM.add(createEarlyCSEPass()); // Catch trivial redundancies
+ PM.add(createJumpThreadingPass()); // Thread jumps.
+ PM.add(createCorrelatedValuePropagationPass()); // Propagate conditionals
+ PM.add(createCFGSimplificationPass()); // Merge & remove BBs
+ PM.add(createInstructionCombiningPass()); // Combine silly seq's
+
+ PM.add(createTailCallEliminationPass()); // Eliminate tail calls
+ PM.add(createCFGSimplificationPass()); // Merge & remove BBs
+ PM.add(createReassociatePass()); // Reassociate expressions
+ PM.add(createLoopRotatePass()); // Rotate Loop
+ PM.add(createLICMPass()); // Hoist loop invariants
+ PM.add(createInstructionCombiningPass());
+ PM.add(createIndVarSimplifyPass()); // Canonicalize indvars
+ PM.add(createLoopIdiomPass()); // Recognize idioms like memset.
+ PM.add(createLoopDeletionPass()); // Delete dead loops
+
+ PM.add(createGVNPass()); // Remove redundancies
+ PM.add(createMemCpyOptPass()); // Remove memcpy / form memset
+ PM.add(createSCCPPass()); // Constant prop with SCCP
+
+ // Run instcombine after redundancy elimination to exploit opportunities
+ // opened up by them.
+ PM.add(createInstructionCombiningPass());
+ PM.add(createJumpThreadingPass()); // Thread jumps
+ PM.add(createCorrelatedValuePropagationPass());
+ PM.add(createDeadStoreEliminationPass()); // Delete dead stores
+ }
}
static void addThreadSanitizerPass(const PassManagerBuilder &Builder,
_______________________________________________
cfe-commits mailing list
[email protected]
http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits