[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:
Vedant Kumar 2019-02-05 23:39:02 +00:00
parent e49209ed88
commit bd94b4287c
3 changed files with 24 additions and 8 deletions

View File

@ -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. Its 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.

View File

@ -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

View File

@ -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: