Fix a think-o in isSafeToMove. This fixes it from thinking that
authorDan Gohman <gohman@apple.com>
Thu, 2 Oct 2008 15:04:30 +0000 (15:04 +0000)
committerDan Gohman <gohman@apple.com>
Thu, 2 Oct 2008 15:04:30 +0000 (15:04 +0000)
volatile memory references are safe to move.

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

lib/CodeGen/MachineInstr.cpp
test/CodeGen/X86/volatile.ll [new file with mode: 0644]

index 4db02f4981913f8c1079d679381defa6c08aba32..4a7059a515f9e666ac9b8d2d452ac1e119116d4c 100644 (file)
@@ -707,7 +707,7 @@ bool MachineInstr::isSafeToMove(const TargetInstrInfo *TII, bool &SawStore) {
   if (TID->mayLoad() && !TII->isInvariantLoad(this))
     // Otherwise, this is a real load.  If there is a store between the load and
     // end of block, or if the laod is volatile, we can't move it.
-    return SawStore || hasVolatileMemoryRef();
+    return !SawStore && !hasVolatileMemoryRef();
 
   return true;
 }
diff --git a/test/CodeGen/X86/volatile.ll b/test/CodeGen/X86/volatile.ll
new file mode 100644 (file)
index 0000000..e40f87b
--- /dev/null
@@ -0,0 +1,17 @@
+; RUN: llvm-as < %s | llc -march=x86 -mattr=sse2 | grep movsd | count 5
+; RUN: llvm-as < %s | llc -march=x86 -mattr=sse2 -fast | grep movsd | count 5
+
+@x = external global double
+
+define void @foo() nounwind  {
+  %a = volatile load double* @x
+  volatile store double 0.0, double* @x
+  volatile store double 0.0, double* @x
+  %b = volatile load double* @x
+  ret void
+}
+
+define void @bar() nounwind  {
+  %c = volatile load double* @x
+  ret void
+}