Files
clang-p2996/llvm/test/Transforms/HotColdSplit/outline-outer-region.ll
Shimin Cui a51f4afc5a [HCS] Externd to outline overlapping sub/super cold regions (#80732)
Currently, with hot cold splitting, when a cold region is identified, it
is added to the region list of ColdBlocks. Then when another cold region
(B) identified overlaps with a ColdBlocks region (A) already added to
the list, the region B is not added to the list because of the
overlapping with region A. The splitting analysis is performed, and the
region A may not get split, for example, if it’s considered too
expansive. This is to improve the handling the overlapping case when the
region A is not considered good for splitting, while the region B is
good for splitting.
 
The change is to move the cold region splitting analysis earlier to
allow more cold region splitting. If an identified region cannot be
split, it will not be added to the candidate list of ColdBlocks for
overlapping check.
2024-02-22 12:04:08 -05:00

53 lines
1.5 KiB
LLVM

; RUN: opt -S -passes=hotcoldsplit -hotcoldsplit-threshold=2 < %s | FileCheck %s
target datalayout = "E-m:a-p:32:32-i64:64-n32"
target triple = "powerpc64-ibm-aix7.2.0.0"
define void @foo(i32 %cond, i32 %s0, i32 %s1) {
; CHECK-LABEL: define {{.*}}@foo(
; CHECK: br i1 {{.*}}, label %codeRepl, label %if.end2
; CHECK-LABEL: codeRepl:
; CHECK-NEXT: call void @foo.cold.1
; CHECK-LABEL: if.end2:
; CHECK: call void @sideeffect
;
entry:
%cond.addr = alloca i32
store i32 %cond, ptr %cond.addr
%0 = load i32, ptr %cond.addr
%tobool = icmp ne i32 %0, 0
br i1 %tobool, label %if.then, label %if.end2
if.then: ; preds = %entry
%1 = load i32, ptr %cond.addr
%cmp = icmp sgt i32 %1, 10
br i1 %cmp, label %if.then1, label %if.else
if.then1: ; preds = %if.then
call void @sideeffect(i32 0)
br label %if.end
if.else: ; preds = %if.then
call void @sink(i32 %s0)
call void @sideeffect(i32 1)
br label %if.end
if.end: ; preds = %if.else, %if.then1
call void @sink(i32 %0)
ret void
if.end2: ; preds = %entry
call void @sideeffect(i32 %s1)
ret void
}
; CHECK-LABEL: define {{.*}}@foo.cold.1
; CHECK: call {{.*}}@sink
; CHECK: call {{.*}}@sideeffect
; CHECK: call {{.*}}@sideeffect
; CHECK: call {{.*}}@sink
declare void @sideeffect(i32)
declare void @sink(i32) cold