Skip to content

Commit 3274c59

Browse files
committed
[JumpThreading][NFC] Precommit tests for pr76609
1 parent dbbdee2 commit 3274c59

File tree

3 files changed

+192
-1
lines changed

3 files changed

+192
-1
lines changed
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt -passes=jump-threading -S < %s | FileCheck %s
3+
4+
define i1 @if_else(i1 %c, i1 %c1) {
5+
; CHECK-LABEL: define i1 @if_else(
6+
; CHECK-SAME: i1 [[C:%.*]], i1 [[C1:%.*]]) {
7+
; CHECK-NEXT: entry:
8+
; CHECK-NEXT: br i1 [[C]], label [[THEN:%.*]], label [[RETURN:%.*]]
9+
; CHECK: then:
10+
; CHECK-NEXT: call void @dummy()
11+
; CHECK-NEXT: br i1 [[C1]], label [[RETURN]], label [[RETURN1:%.*]]
12+
; CHECK: else:
13+
; CHECK-NEXT: br label [[RETURN1]]
14+
; CHECK: return:
15+
; CHECK-NEXT: [[RETVAL_0:%.*]] = phi i1 [ true, [[RETURN]] ], [ false, [[THEN]] ]
16+
; CHECK-NEXT: ret i1 [[RETVAL_0]]
17+
;
18+
entry:
19+
br i1 %c, label %then, label %else
20+
21+
then:
22+
call void @dummy()
23+
br i1 %c1, label %else, label %return
24+
25+
else:
26+
br label %return
27+
28+
return:
29+
%retval.0 = phi i1 [ true, %else ], [ false, %then ]
30+
ret i1 %retval.0
31+
}
32+
33+
define i8 @switch_uncond(i8 %arg) {
34+
; CHECK-LABEL: define i8 @switch_uncond(
35+
; CHECK-SAME: i8 [[ARG:%.*]]) {
36+
; CHECK-NEXT: entry:
37+
; CHECK-NEXT: switch i8 [[ARG]], label [[DEFAULT:%.*]] [
38+
; CHECK-NEXT: i8 0, label [[BB1:%.*]]
39+
; CHECK-NEXT: i8 1, label [[BB3:%.*]]
40+
; CHECK-NEXT: i8 2, label [[BB2:%.*]]
41+
; CHECK-NEXT: i8 3, label [[END:%.*]]
42+
; CHECK-NEXT: ]
43+
; CHECK: default:
44+
; CHECK-NEXT: unreachable
45+
; CHECK: bb:
46+
; CHECK-NEXT: call void @dummy()
47+
; CHECK-NEXT: br label [[BB2]]
48+
; CHECK: bb1:
49+
; CHECK-NEXT: call void @dummy()
50+
; CHECK-NEXT: br label [[BB2]]
51+
; CHECK: bb2:
52+
; CHECK-NEXT: br label [[END]]
53+
; CHECK: end:
54+
; CHECK-NEXT: [[PHI:%.*]] = phi i8 [ 0, [[BB2]] ], [ 1, [[ENTRY:%.*]] ]
55+
; CHECK-NEXT: ret i8 [[PHI]]
56+
;
57+
entry:
58+
switch i8 %arg, label %default [
59+
i8 0, label %bb
60+
i8 1, label %bb1
61+
i8 2, label %bb2
62+
i8 3, label %end
63+
]
64+
65+
default:
66+
unreachable
67+
68+
bb:
69+
call void @dummy()
70+
br label %bb2
71+
72+
bb1:
73+
call void @dummy()
74+
br label %bb2
75+
76+
; Predecessors of %bb2 are %bb and %bb1, they are not identical.
77+
; So we can thread %bb2.
78+
bb2:
79+
br label %end
80+
81+
end:
82+
%phi = phi i8 [ 0, %bb2 ], [ 1, %entry ]
83+
ret i8 %phi
84+
}
85+
86+
define i8 @switch_uncond_fail(i8 %arg) {
87+
; CHECK-LABEL: define i8 @switch_uncond_fail(
88+
; CHECK-SAME: i8 [[ARG:%.*]]) {
89+
; CHECK-NEXT: entry:
90+
; CHECK-NEXT: switch i8 [[ARG]], label [[DEFAULT:%.*]] [
91+
; CHECK-NEXT: i8 0, label [[BB:%.*]]
92+
; CHECK-NEXT: i8 1, label [[BB]]
93+
; CHECK-NEXT: i8 2, label [[END:%.*]]
94+
; CHECK-NEXT: ]
95+
; CHECK: default:
96+
; CHECK-NEXT: br label [[END]]
97+
; CHECK: bb:
98+
; CHECK-NEXT: br label [[END]]
99+
; CHECK: end:
100+
; CHECK-NEXT: [[PHI:%.*]] = phi i8 [ 0, [[BB]] ], [ 1, [[ENTRY:%.*]] ], [ 2, [[DEFAULT]] ]
101+
; CHECK-NEXT: ret i8 [[PHI]]
102+
;
103+
entry:
104+
switch i8 %arg, label %default [
105+
i8 0, label %bb
106+
i8 1, label %bb
107+
i8 2, label %end
108+
]
109+
110+
default:
111+
br label %end
112+
113+
; Predecessor of %bb is only %entry (though there are two in predecessor list),
114+
; thus it's unthreadable.
115+
bb:
116+
br label %end
117+
118+
end:
119+
%phi = phi i8 [ 0, %bb ], [ 1, %entry ], [ 2, %default ]
120+
ret i8 %phi
121+
}
122+
123+
declare void @dummy()

llvm/test/Transforms/SimplifyCFG/branch-fold.ll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ define void @test(ptr %P, ptr %Q, i1 %A, i1 %B) {
66
; CHECK-NEXT: entry:
77
; CHECK-NEXT: [[A_NOT:%.*]] = xor i1 [[A:%.*]], true
88
; CHECK-NEXT: [[BRMERGE:%.*]] = select i1 [[A_NOT]], i1 true, i1 [[B:%.*]]
9-
; CHECK-NEXT: br i1 [[BRMERGE]], label [[B:%.*]], label [[COMMON_RET:%.*]]
9+
; CHECK-NEXT: br i1 [[BRMERGE]], label [[B]], label [[COMMON_RET:%.*]]
1010
; CHECK: common.ret:
1111
; CHECK-NEXT: ret void
1212
; CHECK: b:
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -passes=simplifycfg,instcombine -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck %s
3+
4+
; Add InstCombine pass to demonstrate the effect of threading
5+
6+
define i32 @thread_uncond_bb_cmp(i1 %c, i32 %v) {
7+
; CHECK-LABEL: define i32 @thread_uncond_bb_cmp(
8+
; CHECK-SAME: i1 [[C:%.*]], i32 [[V:%.*]]) {
9+
; CHECK-NEXT: entry:
10+
; CHECK-NEXT: br i1 [[C]], label [[DO_END:%.*]], label [[IF_THEN:%.*]]
11+
; CHECK: if.then:
12+
; CHECK-NEXT: call void @dummy()
13+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[V]], 0
14+
; CHECK-NEXT: br i1 [[TOBOOL]], label [[DO_END]], label [[RETURN:%.*]]
15+
; CHECK: do.end:
16+
; CHECK-NEXT: br label [[RETURN]]
17+
; CHECK: return:
18+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ 0, [[DO_END]] ], [ [[V]], [[IF_THEN]] ]
19+
; CHECK-NEXT: ret i32 [[RETVAL]]
20+
;
21+
entry:
22+
br i1 %c, label %do.end, label %if.then
23+
24+
if.then: ; preds = %entry
25+
call void @dummy()
26+
%tobool = icmp eq i32 %v, 0
27+
br i1 %tobool, label %do.end, label %return
28+
29+
do.end: ; preds = %entry, %if.then
30+
br label %return
31+
32+
return: ; preds = %if.then, %do.end
33+
%retval = phi i32 [ 0, %do.end ], [ %v, %if.then ]
34+
ret i32 %retval
35+
}
36+
37+
define i32 @thread_uncond_bb_cmp_zext(i1 %c, i32 %v) {
38+
; CHECK-LABEL: define i32 @thread_uncond_bb_cmp_zext(
39+
; CHECK-SAME: i1 [[C:%.*]], i32 [[V:%.*]]) {
40+
; CHECK-NEXT: entry:
41+
; CHECK-NEXT: br i1 [[C]], label [[DO_END:%.*]], label [[IF_THEN:%.*]]
42+
; CHECK: if.then:
43+
; CHECK-NEXT: call void @dummy()
44+
; CHECK-NEXT: [[TOBOOL:%.*]] = icmp eq i32 [[V]], 0
45+
; CHECK-NEXT: br i1 [[TOBOOL]], label [[DO_END]], label [[RETURN:%.*]]
46+
; CHECK: do.end:
47+
; CHECK-NEXT: br label [[RETURN]]
48+
; CHECK: return:
49+
; CHECK-NEXT: [[RETVAL:%.*]] = phi i32 [ 0, [[DO_END]] ], [ 1, [[IF_THEN]] ]
50+
; CHECK-NEXT: ret i32 [[RETVAL]]
51+
;
52+
entry:
53+
br i1 %c, label %do.end, label %if.then
54+
55+
if.then: ; preds = %entry
56+
call void @dummy()
57+
%tobool = icmp eq i32 %v, 0
58+
br i1 %tobool, label %do.end, label %return
59+
60+
do.end: ; preds = %entry, %if.then
61+
br label %return
62+
63+
return: ; preds = %if.then, %do.end
64+
%retval = phi i32 [ 0, %do.end ], [ 1, %if.then ]
65+
ret i32 %retval
66+
}
67+
68+
declare void @dummy()

0 commit comments

Comments
 (0)