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

103 lines
2.2 KiB
LLVM

; RUN: opt -S -passes=hotcoldsplit -hotcoldsplit-threshold=0 < %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"
; CHECK-LABEL: define {{.*}}@foo(
; CHECK: landingpad
; CHECK: sideeffect(i32 2)
define void @foo(i32 %cond) personality i8 0 {
entry:
invoke void @llvm.donothing() to label %normal unwind label %exception
exception:
; Note: EH pads are not candidates for region entry points.
%cleanup = landingpad i8 cleanup
br label %continue_exception
continue_exception:
call void @sideeffect(i32 0)
call void @sink()
ret void
normal:
call void @sideeffect(i32 2)
ret void
}
; See llvm.org/PR39917. It's currently not safe to outline landingpad
; instructions.
;
; CHECK-LABEL: define {{.*}}@bar(
; CHECK: landingpad
define void @bar(i32 %cond) personality i8 0 {
entry:
br i1 undef, label %exit, label %continue
exit:
ret void
continue:
invoke void @sink() to label %normal unwind label %exception
exception:
; Note: EH pads are not candidates for region entry points.
%cleanup = landingpad i8 cleanup
br label %trivial-eh-handler
trivial-eh-handler:
call void @sideeffect(i32 1)
br label %normal
normal:
call void @sideeffect(i32 0)
ret void
}
define void @baz() personality i8 0 {
entry:
br i1 undef, label %exit, label %cold1
exit:
ret void
cold1:
; The predecessor of a cold invoke may still be extracted (see baz.cold.2).
call void @sideeffect(i32 0)
br label %cold2
cold2:
invoke void @sink() to label %cold3 unwind label %cold4
cold3:
; The successor of a cold invoke may still be extracted (see baz.cold.1).
call void @sideeffect(i32 1)
ret void
cold4:
landingpad i8 cleanup
ret void
}
; CHECK-LABEL: define {{.*}}@foo.cold.1(
; CHECK: sideeffect(i32 0)
; CHECK: sink
; CHECK-LABEL: define {{.*}}@bar.cold.1(
; CHECK: sideeffect(i32 0)
; CHECK-LABEL: define {{.*}}@bar.cold.2(
; CHECK: sideeffect(i32 1)
; CHECK-LABEL: define {{.*}}@baz.cold.1(
; CHECK: sideeffect(i32 0)
; CHECK-LABEL: define {{.*}}@baz.cold.2(
; CHECK: sideeffect(i32 1)
declare void @sideeffect(i32)
declare void @sink() cold
declare void @llvm.donothing() nounwind readnone