From da31f7b67012692bb019e53b70df1f8f0c388bcd Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Thu, 8 Nov 2018 17:57:09 +0000 Subject: [PATCH] [CodeExtractor] Mark functions noreturn when applicable This eliminates the outlining penalty for llvm.trap/unreachable, because callers no longer have to emit cleanup/ret instructions after calling an outlined `noreturn` function. rdar://45523626 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@346421 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/CodeExtractor.cpp | 7 +++++++ test/Transforms/HotColdSplit/split-cold-2.ll | 3 +++ 2 files changed, 10 insertions(+) diff --git a/lib/Transforms/Utils/CodeExtractor.cpp b/lib/Transforms/Utils/CodeExtractor.cpp index 419e1db08bf..41c3632c82a 100644 --- a/lib/Transforms/Utils/CodeExtractor.cpp +++ b/lib/Transforms/Utils/CodeExtractor.cpp @@ -1330,6 +1330,13 @@ Function *CodeExtractor::extractCodeRegion() { DVI->eraseFromParent(); } + // Mark the new function `noreturn` if applicable. + bool doesNotReturn = none_of(*newFunction, [](const BasicBlock &BB) { + return isa(BB.getTerminator()); + }); + if (doesNotReturn) + newFunction->setDoesNotReturn(); + LLVM_DEBUG(if (verifyFunction(*newFunction)) report_fatal_error("verifyFunction failed!")); return newFunction; diff --git a/test/Transforms/HotColdSplit/split-cold-2.ll b/test/Transforms/HotColdSplit/split-cold-2.ll index ac7d856608c..66c6fbb1b8d 100644 --- a/test/Transforms/HotColdSplit/split-cold-2.ll +++ b/test/Transforms/HotColdSplit/split-cold-2.ll @@ -9,6 +9,9 @@ ; CHECK: codeRepl: ; CHECK-NEXT: call void @fun.cold.1 +; CHECK: define {{.*}}@fun.cold.1{{.*}} [[cold_attr:#[0-9]+]] +; CHECK: attributes [[cold_attr]] = { {{.*}}noreturn + define void @fun() { entry: br i1 undef, label %if.then, label %if.else -- 2.11.0