]> granicus.if.org Git - clang/commitdiff
[msan] Run more optimizations after MemorySanitizer pass.
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 31 Jan 2013 09:53:29 +0000 (09:53 +0000)
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>
Thu, 31 Jan 2013 09:53:29 +0000 (09:53 +0000)
MSan instrumentation is driven by the original code. We take every
incoming instruction and emit another instruction (or ten) next to
it, operating on the shadow values (but sometimes on the real values,
too). Two programs in one, essentially. There can be any kinds of
redundancies in the second one, so we just run whatever is normally
run at -O2, and then exclude some passes that do not help much with
benchmarks.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@174049 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/BackendUtil.cpp

index 6d42df59b41b18d357ee94468160f1b0e28d306a..1d5ff44a50be683cb2db1265b95efb0ae76bf265 100644 (file)
@@ -184,6 +184,18 @@ static void addMemorySanitizerPass(const PassManagerBuilder &Builder,
   const CodeGenOptions &CGOpts = BuilderWrapper.getCGOpts();
   PM.add(createMemorySanitizerPass(CGOpts.SanitizeMemoryTrackOrigins,
                                    CGOpts.SanitizerBlacklistFile));
+
+  // MemorySanitizer inserts complex instrumentation that mostly follows
+  // the logic of the original code, but operates on "shadow" values.
+  // It can benefit from re-running some general purpose optimization passes.
+  if (Builder.OptLevel > 0) {
+    PM.add(createEarlyCSEPass());
+    PM.add(createReassociatePass());
+    PM.add(createLICMPass());
+    PM.add(createGVNPass());
+    PM.add(createInstructionCombiningPass());
+    PM.add(createDeadStoreEliminationPass());
+  }
 }
 
 static void addThreadSanitizerPass(const PassManagerBuilder &Builder,