Fix PR5744, a case where we were getting the pointer size instead of the
authorChris Lattner <sabre@nondot.org>
Thu, 10 Dec 2009 00:11:45 +0000 (00:11 +0000)
committerChris Lattner <sabre@nondot.org>
Thu, 10 Dec 2009 00:11:45 +0000 (00:11 +0000)
value size.  This only manifested when memdep inprecisely returns clobber,
which is do to a caching issue in the PR5744 testcase.  We can 'efficiently
emulate' this by using '-no-aa'

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

lib/Transforms/Scalar/GVN.cpp
test/Transforms/GVN/crash-no-aa.ll [new file with mode: 0644]

index e4e3488a6023164503007b10b8edd957cbe2b61f..dcc9dd4f49cd3c98a73f5e42dc599a10a38ba8ec 100644 (file)
@@ -1084,7 +1084,7 @@ static int AnalyzeLoadFromClobberingStore(const Type *LoadTy, Value *LoadPtr,
     return -1;
 
   Value *StorePtr = DepSI->getPointerOperand();
-  uint64_t StoreSize = TD.getTypeSizeInBits(StorePtr->getType());
+  uint64_t StoreSize = TD.getTypeSizeInBits(DepSI->getOperand(0)->getType());
   return AnalyzeLoadFromClobberingWrite(LoadTy, LoadPtr,
                                         StorePtr, StoreSize, TD);
 }
diff --git a/test/Transforms/GVN/crash-no-aa.ll b/test/Transforms/GVN/crash-no-aa.ll
new file mode 100644 (file)
index 0000000..dae65dd
--- /dev/null
@@ -0,0 +1,16 @@
+; RUN: opt -no-aa -gvn -S %s
+
+target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v1
+28:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
+target triple = "x86_64-unknown-freebsd8.0"
+
+; PR5744
+define i32 @test1({i16, i32} *%P) {
+  %P2 = getelementptr {i16, i32} *%P, i32 0, i32 0
+  store i16 42, i16* %P2
+
+  %P3 = getelementptr {i16, i32} *%P, i32 0, i32 1
+  %V = load i32* %P3
+  ret i32 %V
+}
+