[HotColdSplitting] Attach MinSize to outlined code

Outlined code is cold by assumption, so it makes sense to optimize it
for minimal code size rather than performance.

After r344869 moved the splitting pass to the end of the IR pipeline,
this does not result in much of a code size reduction. This is probably
because a comparatively small number backend transforms make use of the
MinSize hint.

Running LNT on x86_64, I see that 33/1020 binaries shrink for a total of
919 bytes of TEXT reduction. I didn't measure a significant performance
impact.

Differential Revision: https://reviews.llvm.org/D53518

llvm-svn: 345072
This commit is contained in:
Vedant Kumar 2018-10-23 19:41:12 +00:00
parent 551a9585ce
commit 503154615d
2 changed files with 39 additions and 0 deletions

View File

@ -360,6 +360,13 @@ HotColdSplitting::extractColdRegion(const SmallVectorImpl<BasicBlock *> &Region,
CS.setCallingConv(CallingConv::Cold);
}
CI->setIsNoInline();
// Try to make the outlined code as small as possible on the assumption
// that it's cold.
assert(!OutF->hasFnAttribute(Attribute::OptimizeNone) &&
"An outlined function should never be marked optnone");
OutF->addFnAttr(Attribute::MinSize);
LLVM_DEBUG(llvm::dbgs() << "Outlined Region: " << *OutF);
ORE.emit([&]() {
return OptimizationRemark(DEBUG_TYPE, "HotColdSplit",

View File

@ -0,0 +1,32 @@
; RUN: opt -hotcoldsplit -S < %s | FileCheck %s
; CHECK-LABEL: @fun
; CHECK: codeRepl:
; CHECK-NEXT: call void @fun_if.else
define void @fun() {
entry:
br i1 undef, label %if.then, label %if.else
if.then:
ret void
if.else:
br label %if.then4
if.then4:
br i1 undef, label %if.then5, label %if.end
if.then5:
br label %cleanup
if.end:
br label %cleanup
cleanup:
%cleanup.dest.slot.0 = phi i32 [ 1, %if.then5 ], [ 0, %if.end ]
unreachable
}
; CHECK: define {{.*}} @fun_if.else{{.*}}#[[outlined_func_attr:[0-9]+]]
; CHECK: attributes #[[outlined_func_attr]] = { {{.*}}minsize