Skip to content

Commit

Permalink
Place the "cold" code piece into the same section as the original fun…
Browse files Browse the repository at this point in the history
…ction

Summary:
This cropped up in the Linux kernel where cold code was placed in an
incompatible section.

Reviewers: compnerd, vsk, tejohnson

Reviewed By: vsk

Subscribers: hiraditya, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D70925
  • Loading branch information
isanbard committed Dec 2, 2019
1 parent 536ceda commit 87f1467
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 0 deletions.
3 changes: 3 additions & 0 deletions llvm/lib/Transforms/IPO/HotColdSplitting.cpp
Expand Up @@ -328,6 +328,9 @@ Function *HotColdSplitting::extractColdRegion(
}
CI->setIsNoInline();

if (OrigF->hasSection())
OutF->setSection(OrigF->getSection());

markFunctionCold(*OutF, BFI != nullptr);

LLVM_DEBUG(llvm::dbgs() << "Outlined Region: " << *OutF);
Expand Down
33 changes: 33 additions & 0 deletions llvm/test/Transforms/HotColdSplit/retain-section.ll
@@ -0,0 +1,33 @@
; RUN: opt -hotcoldsplit -hotcoldsplit-threshold=0 -S < %s | FileCheck %s

target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-apple-macosx10.14.0"

; Retain section after cold code is split off.

; CHECK-LABEL: @fun
; CHECK: call void @fun.cold.1{{.*}} section ".text.cold"
define void @fun() section ".text.cold" {
entry:
br i1 undef, label %if.then, label %if.else

if.then:
ret void

if.else:
call void @sink()
ret void
}

; CHECK: define {{.*}} @foo{{.*}}#[[outlined_func_attr:[0-9]+]]
define void @foo() cold {
ret void
}

declare void @sink() cold

; CHECK: define {{.*}} @fun.cold.1{{.*}}#[[outlined_func_attr]]

; CHECK: attributes #[[outlined_func_attr]] = {
; CHECK-SAME: cold
; CHECK-SAME: minsize

0 comments on commit 87f1467

Please sign in to comment.