Skip to content

Commit 230d0ea

Browse files
wweiandrewLebedevRI
authored andcommitted
[NFC][PhaseOrdering] Add some tests from D119839
Based on original tests from D119839. See llvm#53853
1 parent 2fe5bf5 commit 230d0ea

File tree

1 file changed

+143
-0
lines changed

1 file changed

+143
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt -O1 -S < %s -enable-new-pm=0 | FileCheck %s
3+
; RUN: opt -O2 -S < %s -enable-new-pm=0 | FileCheck %s
4+
; RUN: opt -O3 -S < %s -enable-new-pm=0 | FileCheck %s
5+
; RUN: opt -passes='default<O1>' -S < %s | FileCheck %s
6+
; RUN: opt -passes='default<O2>' -S < %s | FileCheck %s
7+
; RUN: opt -passes='default<O3>' -S < %s | FileCheck %s
8+
9+
; We are worse at propagating correlation facts when in select form
10+
; as compared to the PHI form, so if we lower switches to early,
11+
; we may make further optimizations problematic.
12+
13+
; propagate value to bb2.
14+
define i64 @test1(i64 %x) {
15+
; CHECK-LABEL: @test1(
16+
; CHECK-NEXT: entry:
17+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i64 [[X:%.*]], 0
18+
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[X]], 100
19+
; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TMP0]], i64 200, i64 10
20+
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = select i1 [[SWITCH]], i64 0, i64 [[DOT]]
21+
; CHECK-NEXT: ret i64 [[COMMON_RET_OP]]
22+
;
23+
entry:
24+
switch i64 %x, label %bb3 [
25+
i64 0, label %bb1
26+
i64 1, label %bb2
27+
]
28+
bb1:
29+
ret i64 0
30+
bb2:
31+
%0 = icmp eq i64 %x, 100
32+
br i1 %0, label %bb4, label %bb5
33+
bb3:
34+
unreachable
35+
bb4:
36+
ret i64 200
37+
bb5:
38+
ret i64 10
39+
}
40+
41+
; propagate value both to bb1 and bb2.
42+
define i64 @test2(i64 %x) {
43+
; CHECK-LABEL: @test2(
44+
; CHECK-NEXT: entry:
45+
; CHECK-NEXT: [[SWITCH_SELECTCMP:%.*]] = icmp eq i64 [[X:%.*]], 101
46+
; CHECK-NEXT: [[SWITCH_SELECT:%.*]] = select i1 [[SWITCH_SELECTCMP]], i64 200, i64 10
47+
; CHECK-NEXT: [[SWITCH_SELECTCMP1:%.*]] = icmp eq i64 [[X]], 1
48+
; CHECK-NEXT: [[SWITCH_SELECT2:%.*]] = select i1 [[SWITCH_SELECTCMP1]], i64 0, i64 [[SWITCH_SELECT]]
49+
; CHECK-NEXT: ret i64 [[SWITCH_SELECT2]]
50+
;
51+
entry:
52+
switch i64 %x, label %bb3 [
53+
i64 1, label %bb1
54+
i64 2, label %bb2
55+
]
56+
bb1:
57+
%0 = icmp eq i64 %x, 100
58+
br i1 %0, label %bb4, label %return
59+
return:
60+
ret i64 0
61+
bb2:
62+
%1 = icmp eq i64 %x, 101
63+
br i1 %1, label %bb4, label %bb5
64+
bb3:
65+
unreachable
66+
bb4:
67+
ret i64 200
68+
bb5:
69+
ret i64 10
70+
}
71+
72+
define i64 @test3(i64 %x) {
73+
; CHECK-LABEL: @test3(
74+
; CHECK-NEXT: entry:
75+
; CHECK-NEXT: [[COND:%.*]] = icmp eq i64 [[X:%.*]], 1
76+
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[COND]], i64 10, i64 0
77+
; CHECK-NEXT: ret i64 [[SPEC_SELECT]]
78+
;
79+
entry:
80+
switch i64 %x, label %bb1 [
81+
i64 1, label %bb2
82+
]
83+
bb1:
84+
ret i64 0
85+
bb2:
86+
%0 = icmp eq i64 %x, 100
87+
br i1 %0, label %bb4, label %bb5
88+
bb4:
89+
ret i64 200
90+
bb5:
91+
ret i64 10
92+
}
93+
94+
; bb2 has two predecessors with case value 1 and 2.
95+
define i64 @test_fail1(i64 %x) {
96+
; CHECK-LABEL: @test_fail1(
97+
; CHECK-NEXT: entry:
98+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i64 [[X:%.*]], 0
99+
; CHECK-NEXT: [[TMP0:%.*]] = icmp eq i64 [[X]], 100
100+
; CHECK-NEXT: [[DOT:%.*]] = select i1 [[TMP0]], i64 200, i64 10
101+
; CHECK-NEXT: [[COMMON_RET_OP:%.*]] = select i1 [[SWITCH]], i64 0, i64 [[DOT]]
102+
; CHECK-NEXT: ret i64 [[COMMON_RET_OP]]
103+
;
104+
entry:
105+
switch i64 %x, label %bb3 [
106+
i64 0, label %bb1
107+
i64 1, label %bb2
108+
i64 2, label %bb2
109+
]
110+
bb1:
111+
ret i64 0
112+
bb2:
113+
%0 = icmp eq i64 %x, 100
114+
br i1 %0, label %bb4, label %bb5
115+
bb3:
116+
unreachable
117+
bb4:
118+
ret i64 200
119+
bb5:
120+
ret i64 10
121+
}
122+
123+
; return block has two predecessors.
124+
define i64 @test_fail2(i64 %x) {
125+
; CHECK-LABEL: @test_fail2(
126+
; CHECK-NEXT: entry:
127+
; CHECK-NEXT: [[SWITCH:%.*]] = icmp eq i64 [[X:%.*]], 0
128+
; CHECK-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[SWITCH]], i64 2, i64 [[X]]
129+
; CHECK-NEXT: ret i64 [[SPEC_SELECT]]
130+
;
131+
entry:
132+
switch i64 %x, label %bb2 [
133+
i64 0, label %bb1
134+
i64 1, label %return
135+
]
136+
bb1:
137+
br label %return
138+
return:
139+
%retval.0 = phi i64 [ %x, %entry ], [ 2, %bb1 ]
140+
ret i64 %retval.0
141+
bb2:
142+
unreachable
143+
}

0 commit comments

Comments
 (0)