From a74459cebda766de84a140d12175c514a8361de3 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 5 Feb 2019 23:39:02 +0000 Subject: [PATCH] [HotColdSplit] Do not split out `resume` instructions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@353242 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/IPO/HotColdSplitting.cpp | 8 ++++++-- test/Transforms/HotColdSplit/resume.ll | 12 +++++++++--- test/Transforms/HotColdSplit/unwind.ll | 12 +++++++++--- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/lib/Transforms/IPO/HotColdSplitting.cpp b/lib/Transforms/IPO/HotColdSplitting.cpp index 36dd6fa4be7..65e7938720d 100644 --- a/lib/Transforms/IPO/HotColdSplitting.cpp +++ b/lib/Transforms/IPO/HotColdSplitting.cpp @@ -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(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(Term) && + !isa(Term); } /// Mark \p F cold. Based on this assumption, also optimize it for minimum size. diff --git a/test/Transforms/HotColdSplit/resume.ll b/test/Transforms/HotColdSplit/resume.ll index 2b8ea7d91d9..67d2d241916 100644 --- a/test/Transforms/HotColdSplit/resume.ll +++ b/test/Transforms/HotColdSplit/resume.ll @@ -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 diff --git a/test/Transforms/HotColdSplit/unwind.ll b/test/Transforms/HotColdSplit/unwind.ll index adcae98d9bb..66e2f76e327 100644 --- a/test/Transforms/HotColdSplit/unwind.ll +++ b/test/Transforms/HotColdSplit/unwind.ll @@ -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: -- 2.40.0