Index: llvm/trunk/lib/Transforms/IPO/HotColdSplitting.cpp =================================================================== --- llvm/trunk/lib/Transforms/IPO/HotColdSplitting.cpp +++ llvm/trunk/lib/Transforms/IPO/HotColdSplitting.cpp @@ -360,6 +360,13 @@ 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", Index: llvm/trunk/test/Transforms/HotColdSplit/minsize.ll =================================================================== --- llvm/trunk/test/Transforms/HotColdSplit/minsize.ll +++ llvm/trunk/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