fix a crash in SCCP handling extractvalue of an array, pointed out and
authorChris Lattner <sabre@nondot.org>
Tue, 10 Nov 2009 22:02:09 +0000 (22:02 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 10 Nov 2009 22:02:09 +0000 (22:02 +0000)
tracked down by Stephan Reiter!

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

lib/Transforms/Scalar/SCCP.cpp
test/Transforms/SCCP/crash.ll

index 509a6dbc12f055c87a4f36180acf8f9c78c5b1bb..c202a2c41de89537d956ccb7b8e08057e29ba1df 100644 (file)
@@ -795,9 +795,14 @@ void SCCPSolver::visitExtractValueInst(ExtractValueInst &EVI) {
     return markOverdefined(&EVI);
 
   Value *AggVal = EVI.getAggregateOperand();
-  unsigned i = *EVI.idx_begin();
-  LatticeVal EltVal = getStructValueState(AggVal, i);
-  mergeInValue(getValueState(&EVI), &EVI, EltVal);
+  if (isa<StructType>(AggVal->getType())) {
+    unsigned i = *EVI.idx_begin();
+    LatticeVal EltVal = getStructValueState(AggVal, i);
+    mergeInValue(getValueState(&EVI), &EVI, EltVal);
+  } else {
+    // Otherwise, must be extracting from an array.
+    return markOverdefined(&EVI);
+  }
 }
 
 void SCCPSolver::visitInsertValueInst(InsertValueInst &IVI) {
index e34eacae844594bef2bf65ef8196aea30ff44730..2f6da1d726a0cc2ead4865b246ca6a8440b0191d 100644 (file)
@@ -22,3 +22,8 @@ bb34:
 return:
   ret void
 }
+
+define i32 @test2([4 x i32] %A) {
+  %B = extractvalue [4 x i32] %A, 1
+  ret i32 %B
+}