
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.
103 lines
2.2 KiB
LLVM
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
|