mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-14 00:32:55 +00:00
make simplifyCFG erase invokes to readonly/readnone functions
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@159385 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c363c74c45
commit
7f71f5f6b8
@ -89,7 +89,6 @@ static void ChangeToUnreachable(Instruction *I, bool UseLLVMTrap) {
|
|||||||
|
|
||||||
/// ChangeToCall - Convert the specified invoke into a normal call.
|
/// ChangeToCall - Convert the specified invoke into a normal call.
|
||||||
static void ChangeToCall(InvokeInst *II) {
|
static void ChangeToCall(InvokeInst *II) {
|
||||||
BasicBlock *BB = II->getParent();
|
|
||||||
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
|
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
|
||||||
CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args, "", II);
|
CallInst *NewCall = CallInst::Create(II->getCalledValue(), Args, "", II);
|
||||||
NewCall->takeName(II);
|
NewCall->takeName(II);
|
||||||
@ -100,10 +99,7 @@ static void ChangeToCall(InvokeInst *II) {
|
|||||||
|
|
||||||
// Follow the call by a branch to the normal destination.
|
// Follow the call by a branch to the normal destination.
|
||||||
BranchInst::Create(II->getNormalDest(), II);
|
BranchInst::Create(II->getNormalDest(), II);
|
||||||
|
II->eraseFromParent();
|
||||||
// Update PHI nodes in the unwind destination
|
|
||||||
II->getUnwindDest()->removePredecessor(BB);
|
|
||||||
BB->getInstList().erase(II);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool MarkAliveBlocks(BasicBlock *BB,
|
static bool MarkAliveBlocks(BasicBlock *BB,
|
||||||
@ -163,7 +159,12 @@ static bool MarkAliveBlocks(BasicBlock *BB,
|
|||||||
ChangeToUnreachable(II, true);
|
ChangeToUnreachable(II, true);
|
||||||
Changed = true;
|
Changed = true;
|
||||||
} else if (II->doesNotThrow()) {
|
} 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;
|
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 i32 @__gxx_personality_v0(...)
|
||||||
declare void @__cxa_call_unexpected(i8*)
|
declare void @__cxa_call_unexpected(i8*)
|
||||||
declare i64 @llvm.objectsize.i64(i8*, i1) nounwind readonly
|
declare i32 @read_only() nounwind readonly
|
||||||
|
|
||||||
|
|
||||||
; CHECK: @f1
|
; CHECK: @f1
|
||||||
@ -43,3 +43,42 @@ lpad:
|
|||||||
tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
|
tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
|
||||||
unreachable
|
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…
x
Reference in New Issue
Block a user