Skip to content

Commit fc1457d

Browse files
committed
[SimplifyCFG] Add test on prevent merging cbranch to cbranch if the branch probabililty from the first to second is too low.
1 parent 509b570 commit fc1457d

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=simplifycfg -simplifycfg-cbranch-to-cbranch-weight-ratio=100 -S | FileCheck %s
3+
4+
declare void @bar()
5+
declare i1 @uniform_result(i1 %c)
6+
7+
define void @dont_merge_cbranches1(i32 %V) {
8+
; CHECK-LABEL: @dont_merge_cbranches1(
9+
; CHECK-NEXT: [[DIVERGENT_COND:%.*]] = icmp ne i32 [[V:%.*]], 0
10+
; CHECK-NEXT: [[UNIFORM_COND:%.*]] = call i1 @uniform_result(i1 [[DIVERGENT_COND]])
11+
; CHECK-NEXT: [[UNIFORM_COND_NOT:%.*]] = xor i1 [[UNIFORM_COND]], true
12+
; CHECK-NEXT: [[DIVERGENT_COND_NOT:%.*]] = xor i1 [[DIVERGENT_COND]], true
13+
; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[UNIFORM_COND_NOT]], i1 true, i1 [[DIVERGENT_COND_NOT]]
14+
; CHECK-NEXT: br i1 [[BRMERGE]], label [[EXIT:%.*]], label [[BB3:%.*]], !prof [[PROF0:![0-9]+]]
15+
; CHECK: bb3:
16+
; CHECK-NEXT: call void @bar()
17+
; CHECK-NEXT: br label [[EXIT]]
18+
; CHECK: exit:
19+
; CHECK-NEXT: ret void
20+
;
21+
%divergent_cond = icmp ne i32 %V, 0
22+
%uniform_cond = call i1 @uniform_result(i1 %divergent_cond)
23+
br i1 %uniform_cond, label %bb2, label %exit, !prof !0
24+
bb2:
25+
br i1 %divergent_cond, label %bb3, label %exit
26+
bb3:
27+
call void @bar( )
28+
br label %exit
29+
exit:
30+
ret void
31+
}
32+
33+
define void @dont_merge_cbranches2(i32 %V) {
34+
; CHECK-LABEL: @dont_merge_cbranches2(
35+
; CHECK-NEXT: [[DIVERGENT_COND:%.*]] = icmp ne i32 [[V:%.*]], 0
36+
; CHECK-NEXT: [[UNIFORM_COND:%.*]] = call i1 @uniform_result(i1 [[DIVERGENT_COND]])
37+
; CHECK-NEXT: [[DIVERGENT_COND_NOT:%.*]] = xor i1 [[DIVERGENT_COND]], true
38+
; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[UNIFORM_COND]], i1 true, i1 [[DIVERGENT_COND_NOT]]
39+
; CHECK-NEXT: br i1 [[BRMERGE]], label [[EXIT:%.*]], label [[BB3:%.*]], !prof [[PROF0]]
40+
; CHECK: bb3:
41+
; CHECK-NEXT: call void @bar()
42+
; CHECK-NEXT: br label [[EXIT]]
43+
; CHECK: exit:
44+
; CHECK-NEXT: ret void
45+
;
46+
%divergent_cond = icmp ne i32 %V, 0
47+
%uniform_cond = call i1 @uniform_result(i1 %divergent_cond)
48+
br i1 %uniform_cond, label %exit, label %bb2, !prof !1
49+
bb2:
50+
br i1 %divergent_cond, label %bb3, label %exit
51+
bb3:
52+
call void @bar( )
53+
br label %exit
54+
exit:
55+
ret void
56+
}
57+
58+
!0 = !{!"branch_weights", i32 1, i32 1000}
59+
!1 = !{!"branch_weights", i32 1000, i32 1}

0 commit comments

Comments
 (0)