mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
make simplifyCFG erase invokes to readonly/readnone functions
llvm-svn: 159385
This commit is contained in:
parent
b0d4abe297
commit
66896bbd47
@ -89,7 +89,6 @@ static void ChangeToUnreachable(Instruction *I, bool UseLLVMTrap) {
|
||||
|
||||
/// ChangeToCall - Convert the specified invoke into a normal call.
|
||||
static void ChangeToCall(InvokeInst *II) {
|
||||
BasicBlock *BB = II->getParent();
|
||||
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
|
||||
CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args, "", II);
|
||||
NewCall->takeName(II);
|
||||
@ -100,10 +99,7 @@ static void ChangeToCall(InvokeInst *II) {
|
||||
|
||||
// Follow the call by a branch to the normal destination.
|
||||
BranchInst::Create(II->getNormalDest(), II);
|
||||
|
||||
// Update PHI nodes in the unwind destination
|
||||
II->getUnwindDest()->removePredecessor(BB);
|
||||
BB->getInstList().erase(II);
|
||||
II->eraseFromParent();
|
||||
}
|
||||
|
||||
static bool MarkAliveBlocks(BasicBlock *BB,
|
||||
@ -163,7 +159,12 @@ static bool MarkAliveBlocks(BasicBlock *BB,
|
||||
ChangeToUnreachable(II, true);
|
||||
Changed = true;
|
||||
} else if (II->doesNotThrow()) {
|
||||
ChangeToCall(II);
|
||||
if (II->use_empty() && II->onlyReadsMemory()) {
|
||||
// jump to the normal destination branch.
|
||||
BranchInst::Create(II->getNormalDest(), II);
|
||||
II->eraseFromParent();
|
||||
} else
|
||||
ChangeToCall(II);
|
||||
Changed = true;
|
||||
}
|
||||
}
|
||||
|
@ -3,7 +3,7 @@ target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f3
|
||||
|
||||
declare i32 @__gxx_personality_v0(...)
|
||||
declare void @__cxa_call_unexpected(i8*)
|
||||
declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readonly
|
||||
declare i32 @read_only() nounwind readonly
|
||||
|
||||
|
||||
; CHECK: @f1
|
||||
@ -43,3 +43,42 @@ lpad:
|
||||
tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
|
||||
unreachable
|
||||
}
|
||||
|
||||
; CHECK: @f3
|
||||
define i32 @f3() nounwind uwtable ssp {
|
||||
; CHECK-NEXT: entry
|
||||
entry:
|
||||
; CHECK-NEXT: ret i32 3
|
||||
%call = invoke i32 @read_only()
|
||||
to label %invoke.cont unwind label %lpad
|
||||
|
||||
invoke.cont:
|
||||
ret i32 3
|
||||
|
||||
lpad:
|
||||
%0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
filter [0 x i8*] zeroinitializer
|
||||
%1 = extractvalue { i8*, i32 } %0, 0
|
||||
tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
|
||||
unreachable
|
||||
}
|
||||
|
||||
; CHECK: @f4
|
||||
define i32 @f4() nounwind uwtable ssp {
|
||||
; CHECK-NEXT: entry
|
||||
entry:
|
||||
; CHECK-NEXT: call i32 @read_only()
|
||||
%call = invoke i32 @read_only()
|
||||
to label %invoke.cont unwind label %lpad
|
||||
|
||||
invoke.cont:
|
||||
; CHECK-NEXT: ret i32 %call
|
||||
ret i32 %call
|
||||
|
||||
lpad:
|
||||
%0 = landingpad { i8*, i32 } personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*)
|
||||
filter [0 x i8*] zeroinitializer
|
||||
%1 = extractvalue { i8*, i32 } %0, 0
|
||||
tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
|
||||
unreachable
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user