[LibcallsShrinkWrap] This pass doesn't preserve the CFG.
authorDavide Italiano <davide@freebsd.org>
Tue, 8 Nov 2016 19:18:20 +0000 (19:18 +0000)
committerDavide Italiano <davide@freebsd.org>
Tue, 8 Nov 2016 19:18:20 +0000 (19:18 +0000)
For example, it invalidates the domtree, causing assertions
in later passes which need dominator infos. Make it preserve
GlobalsAA, as suggested by Eli.

Differential Revision:  https://reviews.llvm.org/D26381

llvm-svn: 286271

llvm/lib/Transforms/Utils/LibCallsShrinkWrap.cpp
llvm/test/Transforms/InstCombine/pr30929.ll [new file with mode: 0644]

index c9924984bb572a8ba64716bd999a7dc00b0cf40c..b59ddcffeff50e357fc7b10992bf6b48f1827d17 100644 (file)
@@ -29,6 +29,7 @@
 #include "llvm/Transforms/Utils/LibCallsShrinkWrap.h"
 #include "llvm/ADT/SmallVector.h"
 #include "llvm/ADT/Statistic.h"
+#include "llvm/Analysis/GlobalsModRef.h"
 #include "llvm/Analysis/TargetLibraryInfo.h"
 #include "llvm/IR/CFG.h"
 #include "llvm/IR/Constants.h"
@@ -529,7 +530,7 @@ bool LibCallsShrinkWrap::perform(CallInst *CI) {
 }
 
 void LibCallsShrinkWrapLegacyPass::getAnalysisUsage(AnalysisUsage &AU) const {
-  AU.setPreservesCFG();
+  AU.addPreserved<GlobalsAAWrapperPass>();
   AU.addRequired<TargetLibraryInfoWrapperPass>();
 }
 
@@ -561,6 +562,8 @@ PreservedAnalyses LibCallsShrinkWrapPass::run(Function &F,
   bool Changed = runImpl(F, TLI);
   if (!Changed)
     return PreservedAnalyses::all();
-  return PreservedAnalyses::none();
+  auto PA = PreservedAnalyses();
+  PA.preserve<GlobalsAA>();
+  return PA;
 }
 }
diff --git a/llvm/test/Transforms/InstCombine/pr30929.ll b/llvm/test/Transforms/InstCombine/pr30929.ll
new file mode 100644 (file)
index 0000000..2d19775
--- /dev/null
@@ -0,0 +1,11 @@
+; We need this pipeline because to trigger dominator info verification
+; we have to compute the dominator before libcalls-shrinkwrap and
+; have a pass which requires the dominator tree after.
+; RUN: opt -domtree -libcalls-shrinkwrap -instcombine -verify-dom-info %s
+
+define void @main() {
+  %_tmp31 = call float @acosf(float 2.000000e+00)
+  ret void
+}
+
+declare float @acosf(float)