InstSimplify: Don't try to replace an extractvalue/insertvalue pair with the original...
authorBenjamin Kramer <benny.kra@googlemail.com>
Mon, 5 Sep 2011 18:16:19 +0000 (18:16 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Mon, 5 Sep 2011 18:16:19 +0000 (18:16 +0000)
Fixes clang selfhost.

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

lib/Analysis/InstructionSimplify.cpp
test/Transforms/InstSimplify/2011-09-05-InsertExtractValue.ll

index deb7fed18b3993bade2f0ab04c0c53b8d5b5abda..131cc97d237965bd5efbef6fd62fbac8635a3ea1 100644 (file)
@@ -2286,7 +2286,8 @@ Value *llvm::SimplifyInsertValueInst(Value *Agg, Value *Val,
 
   // insertvalue x, (extractvalue y, n), n
   if (ExtractValueInst *EV = dyn_cast<ExtractValueInst>(Val))
-    if (EV->getIndices() == Idxs) {
+    if (EV->getAggregateOperand()->getType() == Agg->getType() &&
+        EV->getIndices() == Idxs) {
       // insertvalue undef, (extractvalue y, n), n -> y
       if (match(Agg, m_Undef()))
         return EV->getAggregateOperand();
index 4067d5dc76ccec706418a38cdece3beadc87a700..d10c61fe2cf77a38731681b0f06b9e97b784d9cf 100644 (file)
@@ -1,11 +1,8 @@
 ; RUN: opt < %s -instsimplify -S | FileCheck %s
 
-; CHECK-NOT: extractvalue
-; CHECK-NOT: insertvalue
-
 declare void @bar()
 
-define void @foo() {
+define void @test1() {
 entry:
   invoke void @bar() to label %cont unwind label %lpad
 cont:
@@ -17,6 +14,16 @@ lpad:
   %exc_ptr2 = insertvalue { i8*, i32 } undef, i8* %exc_ptr, 0
   %filter2 = insertvalue { i8*, i32 } %exc_ptr2, i32 %filter, 1
   resume { i8*, i32 } %filter2
+; CHECK: @test1
+; CHECK-NOT: extractvalue
+; CHECK-NOT: insertvalue
 }
 
 declare i32 @__gxx_personality_v0(i32, i64, i8*, i8*)
+
+define { i8, i32 } @test2({ i8*, i32 } %x) {
+  %ex = extractvalue { i8*, i32 } %x, 1
+  %ins = insertvalue { i8, i32 } undef, i32 %ex, 1
+  ret { i8, i32 } %ins
+; CHECK: @test2
+}