]> granicus.if.org Git - llvm/commitdiff
[MergedLoadStoreMotion] Use correct helper for load hoist safety.
authorEli Friedman <eli.friedman@gmail.com>
Sun, 12 Jun 2016 02:11:20 +0000 (02:11 +0000)
committerEli Friedman <eli.friedman@gmail.com>
Sun, 12 Jun 2016 02:11:20 +0000 (02:11 +0000)
It isn't legal to hoist a load past a call which might not return;
even if it doesn't throw, it could, for example, call exit().

Fixes http://llvm.org/PR27953.

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

lib/Transforms/Scalar/MergedLoadStoreMotion.cpp
test/Transforms/InstMerge/exceptions.ll

index e300c9f65d9ac9a98006aedb5de93f444f692b2b..6010c80cd93a904c28d9eb76143bbcc320491ab3 100644 (file)
@@ -79,6 +79,7 @@
 #include "llvm/Analysis/Loads.h"
 #include "llvm/Analysis/MemoryBuiltins.h"
 #include "llvm/Analysis/MemoryDependenceAnalysis.h"
+#include "llvm/Analysis/ValueTracking.h"
 #include "llvm/IR/Metadata.h"
 #include "llvm/IR/PatternMatch.h"
 #include "llvm/Support/Debug.h"
@@ -232,7 +233,7 @@ bool MergedLoadStoreMotion::isLoadHoistBarrierInRange(
   if (!SafeToLoadUnconditionally)
     for (const Instruction &Inst :
          make_range(Start.getIterator(), End.getIterator()))
-      if (Inst.mayThrow())
+      if (!isGuaranteedToTransferExecutionToSuccessor(&Inst))
         return true;
   MemoryLocation Loc = MemoryLocation::get(LI);
   return AA->canInstructionRangeModRef(Start, End, Loc, MRI_Mod);
index 8564215e72abdfc801875b3e9d92df16bec43672..06b79664d7d73987773cdd7e4b2b707051e643d8 100644 (file)
@@ -11,12 +11,12 @@ entry:
   br i1 %cmp, label %if.then, label %if.else
 
 if.then:                                          ; preds = %entry
-  call void @may_throw()
+  call void @may_exit() nounwind
   %arrayidx = getelementptr inbounds i32, i32* %p, i64 1
   %0 = load i32, i32* %arrayidx, align 4
   store i32 %0, i32* @r, align 4
   br label %if.end
-; CHECK:       call void @may_throw()
+; CHECK:       call void @may_exit()
 ; CHECK-NEXT:  %[[gep:.*]] = getelementptr inbounds i32, i32* %p, i64 1
 ; CHECK-NEXT:  %[[load:.*]] = load i32, i32* %[[gep]], align 4
 ; CHECK-NEXT:  store i32 %[[load]], i32* @r, align 4
@@ -55,3 +55,4 @@ if.end:                                           ; preds = %if.else, %if.then
 }
 
 declare void @may_throw()
+declare void @may_exit() nounwind