Fix PR3807 by inserting 'insertelement' instructions in the normal dest of

an invoke instead of after the invoke (in its block), which is invalid.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67139 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chris Lattner 2009-03-18 00:31:45 +00:00
parent 64ec298e68
commit bda0765e07
2 changed files with 25 additions and 5 deletions

View File

@ -798,9 +798,13 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
// Replace by null for now. // Replace by null for now.
Call->replaceAllUsesWith(Constant::getNullValue(Call->getType())); Call->replaceAllUsesWith(Constant::getNullValue(Call->getType()));
} else { } else {
assert(isa<StructType>(RetTy) && "Return type changed, but not into a" assert(isa<StructType>(RetTy) &&
"void. The old return type must have" "Return type changed, but not into a void. The old return type"
"been a struct!"); " must have been a struct!");
Instruction *InsertPt = Call;
if (InvokeInst *II = dyn_cast<InvokeInst>(Call))
InsertPt = II->getNormalDest()->begin();
// We used to return a struct. Instead of doing smart stuff with all the // We used to return a struct. Instead of doing smart stuff with all the
// uses of this struct, we will just rebuild it using // uses of this struct, we will just rebuild it using
// extract/insertvalue chaining and let instcombine clean that up. // extract/insertvalue chaining and let instcombine clean that up.
@ -813,12 +817,13 @@ bool DAE::RemoveDeadStuffFromFunction(Function *F) {
if (RetTypes.size() > 1) if (RetTypes.size() > 1)
// We are still returning a struct, so extract the value from our // We are still returning a struct, so extract the value from our
// return value // return value
V = ExtractValueInst::Create(New, NewRetIdxs[i], "newret", Call); V = ExtractValueInst::Create(New, NewRetIdxs[i], "newret",
InsertPt);
else else
// We are now returning a single element, so just insert that // We are now returning a single element, so just insert that
V = New; V = New;
// Insert the value at the old position // Insert the value at the old position
RetVal = InsertValueInst::Create(RetVal, V, i, "oldret", Call); RetVal = InsertValueInst::Create(RetVal, V, i, "oldret", InsertPt);
} }
// Now, replace all uses of the old call instruction with the return // Now, replace all uses of the old call instruction with the return
// struct we built // struct we built

View File

@ -0,0 +1,15 @@
; RUN: llvm-as < %s | opt -deadargelim | llvm-dis
; PR3807
define internal { i32, i32 } @foo() {
ret {i32,i32} {i32 42, i32 4}
}
define i32 @bar() {
%x = invoke {i32,i32} @foo() to label %T unwind label %T2
T:
%y = extractvalue {i32,i32} %x, 1
ret i32 %y
T2:
unreachable
}