mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 21:29:41 +00:00
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:
parent
64ec298e68
commit
bda0765e07
@ -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
|
||||||
|
15
test/Transforms/DeadArgElim/2009-03-17-MRE-Invoke.ll
Normal file
15
test/Transforms/DeadArgElim/2009-03-17-MRE-Invoke.ll
Normal 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
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user