[HotColdSplit] Do not split out resume instructions
Resumes that are not reachable from a cleanup landing pad are considered to be unreachable. It’s not safe to split them out. rdar://47808235 llvm-svn: 353242
This commit is contained in:
parent
e49209ed88
commit
bd94b4287c
@ -135,8 +135,12 @@ static bool mayExtractBlock(const BasicBlock &BB) {
|
||||
// EH pads are unsafe to outline because doing so breaks EH type tables. It
|
||||
// follows that invoke instructions cannot be extracted, because CodeExtractor
|
||||
// requires unwind destinations to be within the extraction region.
|
||||
return !BB.hasAddressTaken() && !BB.isEHPad() &&
|
||||
!isa<InvokeInst>(BB.getTerminator());
|
||||
//
|
||||
// Resumes that are not reachable from a cleanup landing pad are considered to
|
||||
// be unreachable. It’s not safe to split them out either.
|
||||
auto Term = BB.getTerminator();
|
||||
return !BB.hasAddressTaken() && !BB.isEHPad() && !isa<InvokeInst>(Term) &&
|
||||
!isa<ResumeInst>(Term);
|
||||
}
|
||||
|
||||
/// Mark \p F cold. Based on this assumption, also optimize it for minimum size.
|
||||
|
||||
@ -6,11 +6,17 @@ target triple = "x86_64-apple-macosx10.14.0"
|
||||
; Consider `resume` to be cold.
|
||||
|
||||
; CHECK-LABEL: define {{.*}}@foo.cold.1(
|
||||
; CHECK: resume i32 undef
|
||||
; CHECK: call {{.*}}@sink(
|
||||
|
||||
define i32 @foo(i32 %cond) personality i8 0 {
|
||||
declare void @sink() cold
|
||||
|
||||
define i32 @foo() personality i8 0 {
|
||||
entry:
|
||||
br i1 undef, label %resume-eh, label %normal
|
||||
br i1 undef, label %pre-resume-eh, label %normal
|
||||
|
||||
pre-resume-eh:
|
||||
call void @sink()
|
||||
br label %resume-eh
|
||||
|
||||
resume-eh:
|
||||
resume i32 undef
|
||||
|
||||
@ -3,12 +3,15 @@
|
||||
target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
|
||||
target triple = "x86_64-apple-macosx10.14.0"
|
||||
|
||||
; Do not mark outlined functions which resume exception unwinding as noreturn.
|
||||
; Do not split out `resume` instructions.
|
||||
|
||||
; CHECK-LABEL: define {{.*}}@foo.cold.1(
|
||||
; CHECK: resume
|
||||
; CHECK: call {{.*}}@sink(
|
||||
; CHECK-NOT: resume i32 undef
|
||||
|
||||
; CHECK-NOT: noreturn
|
||||
define i32 @foo(i32 %cond) personality i8 0 {
|
||||
|
||||
define i32 @foo() personality i8 0 {
|
||||
entry:
|
||||
invoke void @llvm.donothing() to label %normal unwind label %exception
|
||||
|
||||
@ -19,6 +22,9 @@ exception:
|
||||
continue_exception:
|
||||
call void @sideeffect(i32 0)
|
||||
call void @sink()
|
||||
br label %resume-eh
|
||||
|
||||
resume-eh:
|
||||
resume i32 undef
|
||||
|
||||
normal:
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user