From 503154615dac70491fef4797da6b35761320aaa1 Mon Sep 17 00:00:00 2001 From: Vedant Kumar Date: Tue, 23 Oct 2018 19:41:12 +0000 Subject: [PATCH] [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 --- llvm/lib/Transforms/IPO/HotColdSplitting.cpp | 7 ++++++ llvm/test/Transforms/HotColdSplit/minsize.ll | 32 ++++++++++++++++++++++++++++ 2 files changed, 39 insertions(+) create mode 100644 llvm/test/Transforms/HotColdSplit/minsize.ll diff --git a/llvm/lib/Transforms/IPO/HotColdSplitting.cpp b/llvm/lib/Transforms/IPO/HotColdSplitting.cpp index 1d804cc..d3e086e 100644 --- a/llvm/lib/Transforms/IPO/HotColdSplitting.cpp +++ b/llvm/lib/Transforms/IPO/HotColdSplitting.cpp @@ -360,6 +360,13 @@ HotColdSplitting::extractColdRegion(const SmallVectorImpl &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", diff --git a/llvm/test/Transforms/HotColdSplit/minsize.ll b/llvm/test/Transforms/HotColdSplit/minsize.ll new file mode 100644 index 0000000..f7509bf --- /dev/null +++ b/llvm/test/Transforms/HotColdSplit/minsize.ll @@ -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 -- 2.7.4