Fix for regression: [Bug 20369] wrong code at -O3 on x86_64-linux-gnu in 64-bit mode
authorGerolf Hoflehner <ghoflehner@apple.com>
Mon, 21 Jul 2014 03:02:46 +0000 (03:02 +0000)
committerGerolf Hoflehner <ghoflehner@apple.com>
Mon, 21 Jul 2014 03:02:46 +0000 (03:02 +0000)
Prevents hoisting of loads above stores and sinking of stores below loads
in MergedLoadStoreMotion.cpp (rdar://15991737)

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

lib/Transforms/Scalar/MergedLoadStoreMotion.cpp

index 7be4715f15d83af7576079703948c7c70c9e67ee..a7e80240d9e7acf7d12d688800af1399141cf8c3 100644 (file)
@@ -243,6 +243,10 @@ bool MergedLoadStoreMotion::isLoadHoistBarrier(Instruction *Inst) {
     return true;
   if (isa<TerminatorInst>(Inst))
     return true;
+  // FIXME: Conservatively let a store instruction block the load.
+  // Use alias analysis instead.
+  if (isa<StoreInst>(Inst))
+    return true;
   // Note: mayHaveSideEffects covers all instructions that could
   // trigger a change to state. Eg. in-flight stores have to be executed
   // before ordered loads or fences, calls could invoke functions that store
@@ -411,8 +415,12 @@ bool MergedLoadStoreMotion::mergeLoads(BasicBlock *BB) {
 
 ///
 /// \brief True when instruction is sink barrier for a store
-///
+/// 
 bool MergedLoadStoreMotion::isStoreSinkBarrier(Instruction *Inst) {
+  // FIXME: Conservatively let a load instruction block the store.
+  // Use alias analysis instead.
+  if (isa<LoadInst>(Inst))
+    return true;
   if (isa<CallInst>(Inst))
     return true;
   if (isa<TerminatorInst>(Inst) && !isa<BranchInst>(Inst))