Don't let globalopt hack on volatile loads or stores.
authorChris Lattner <sabre@nondot.org>
Tue, 29 Jan 2008 19:01:37 +0000 (19:01 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 29 Jan 2008 19:01:37 +0000 (19:01 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46523 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/GlobalOpt.cpp
test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll [new file with mode: 0644]

index ea8080e35e89590cde78b2f88efec3eb7d555cf1..7bed9e22d11e83b5e1e1d0b1ee73f8bbbb1d34fb 100644 (file)
@@ -163,12 +163,15 @@ static bool AnalyzeGlobal(Value *V, GlobalStatus &GS,
         else if (GS.AccessingFunction != F)
           GS.HasMultipleAccessingFunctions = true;
       }
-      if (isa<LoadInst>(I)) {
+      if (LoadInst *LI = dyn_cast<LoadInst>(I)) {
         GS.isLoaded = true;
+        if (LI->isVolatile()) return true;  // Don't hack on volatile loads.
       } else if (StoreInst *SI = dyn_cast<StoreInst>(I)) {
         // Don't allow a store OF the address, only stores TO the address.
         if (SI->getOperand(0) == V) return true;
 
+        if (SI->isVolatile()) return true;  // Don't hack on volatile stores.
+
         // If this is a direct store to the global (i.e., the global is a scalar
         // value, not an aggregate), keep more specific information about
         // stores.
diff --git a/test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll b/test/Transforms/GlobalOpt/2008-01-29-VolatileGlobal.ll
new file mode 100644 (file)
index 0000000..0a8dd49
--- /dev/null
@@ -0,0 +1,9 @@
+; RUN: llvm-as < %s | opt -globalopt | llvm-dis | grep {volatile load}
+@t0.1441 = internal global double 0x3FD5555555555555, align 8          ; <double*> [#uses=1]
+
+define double @foo() nounwind  {
+entry:
+       %tmp1 = volatile load double* @t0.1441, align 8         ; <double> [#uses=2]
+       %tmp4 = mul double %tmp1, %tmp1         ; <double> [#uses=1]
+       ret double %tmp4
+}