Skip to content

Commit 0c4842d

Browse files
committed
[JumpThreading][NFC] Precommit tests for pr76609
1 parent d7c6728 commit 0c4842d

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed
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()

0 commit comments

Comments
 (0)