xref: /llvm-project/llvm/test/Transforms/EarlyCSE/and_or.ll (revision c384b20b55c730f2382013d18b41269f04757873)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=early-cse -earlycse-debug-hash -S < %s | FileCheck %s
3; RUN: opt -passes='early-cse<memssa>' -S < %s | FileCheck %s
4
5define i32 @test_01(i32 %a, i32 %b) {
6; CHECK-LABEL: @test_01(
7; CHECK-NEXT:  entry:
8; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
9; CHECK-NEXT:    br i1 [[COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
10; CHECK:       if.true:
11; CHECK-NEXT:    ret i32 [[A]]
12; CHECK:       if.false:
13; CHECK-NEXT:    ret i32 [[B]]
14;
15entry:
16  %cond = icmp slt i32 %a, %b
17  br i1 %cond, label %if.true, label %if.false
18
19if.true:
20  %cond2 = icmp slt i32 %a, %b
21  %x = select i1 %cond2, i32 %a, i32 %b
22  ret i32 %x
23
24if.false:
25  %cond3 = icmp slt i32 %a, %b
26  %y = select i1 %cond3, i32 %a, i32 %b
27  ret i32 %y
28}
29
30define i32 @test_02(i32 %a, i32 %b, i1 %c) {
31; CHECK-LABEL: @test_02(
32; CHECK-NEXT:  entry:
33; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
34; CHECK-NEXT:    [[AND_COND:%.*]] = and i1 [[COND]], [[C:%.*]]
35; CHECK-NEXT:    br i1 [[AND_COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
36; CHECK:       if.true:
37; CHECK-NEXT:    ret i32 [[A]]
38; CHECK:       if.false:
39; CHECK-NEXT:    [[Y:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
40; CHECK-NEXT:    ret i32 [[Y]]
41;
42entry:
43  %cond = icmp slt i32 %a, %b
44  %and.cond = and i1 %cond, %c
45  br i1 %and.cond, label %if.true, label %if.false
46
47if.true:
48  %cond2 = icmp slt i32 %a, %b
49  %x = select i1 %cond2, i32 %a, i32 %b
50  ret i32 %x
51
52if.false:
53  %cond3 = icmp slt i32 %a, %b
54  %y = select i1 %cond3, i32 %a, i32 %b
55  ret i32 %y
56}
57
58define i32 @test_02_select(i32 %a, i32 %b, i1 %c) {
59; CHECK-LABEL: @test_02_select(
60; CHECK-NEXT:  entry:
61; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
62; CHECK-NEXT:    [[AND_COND:%.*]] = select i1 [[COND]], i1 [[C:%.*]], i1 false
63; CHECK-NEXT:    br i1 [[AND_COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
64; CHECK:       if.true:
65; CHECK-NEXT:    ret i32 [[A]]
66; CHECK:       if.false:
67; CHECK-NEXT:    [[Y:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
68; CHECK-NEXT:    ret i32 [[Y]]
69;
70entry:
71  %cond = icmp slt i32 %a, %b
72  %and.cond = select i1 %cond, i1 %c, i1 false
73  br i1 %and.cond, label %if.true, label %if.false
74
75if.true:
76  %cond2 = icmp slt i32 %a, %b
77  %x = select i1 %cond2, i32 %a, i32 %b
78  ret i32 %x
79
80if.false:
81  %cond3 = icmp slt i32 %a, %b
82  %y = select i1 %cond3, i32 %a, i32 %b
83  ret i32 %y
84}
85
86define i32 @test_03(i32 %a, i32 %b, i1 %c) {
87; CHECK-LABEL: @test_03(
88; CHECK-NEXT:  entry:
89; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
90; CHECK-NEXT:    [[OR_COND:%.*]] = or i1 [[COND]], [[C:%.*]]
91; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
92; CHECK:       if.true:
93; CHECK-NEXT:    [[X:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
94; CHECK-NEXT:    ret i32 [[X]]
95; CHECK:       if.false:
96; CHECK-NEXT:    ret i32 [[B]]
97;
98entry:
99  %cond = icmp slt i32 %a, %b
100  %or.cond = or i1 %cond, %c
101  br i1 %or.cond, label %if.true, label %if.false
102
103if.true:
104  %cond2 = icmp slt i32 %a, %b
105  %x = select i1 %cond2, i32 %a, i32 %b
106  ret i32 %x
107
108if.false:
109  %cond3 = icmp slt i32 %a, %b
110  %y = select i1 %cond3, i32 %a, i32 %b
111  ret i32 %y
112}
113
114define i32 @test_03_select(i32 %a, i32 %b, i1 %c) {
115; CHECK-LABEL: @test_03_select(
116; CHECK-NEXT:  entry:
117; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
118; CHECK-NEXT:    [[OR_COND:%.*]] = select i1 [[COND]], i1 true, i1 [[C:%.*]]
119; CHECK-NEXT:    br i1 [[OR_COND]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
120; CHECK:       if.true:
121; CHECK-NEXT:    [[X:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
122; CHECK-NEXT:    ret i32 [[X]]
123; CHECK:       if.false:
124; CHECK-NEXT:    ret i32 [[B]]
125;
126entry:
127  %cond = icmp slt i32 %a, %b
128  %or.cond = select i1 %cond, i1 true, i1 %c
129  br i1 %or.cond, label %if.true, label %if.false
130
131if.true:
132  %cond2 = icmp slt i32 %a, %b
133  %x = select i1 %cond2, i32 %a, i32 %b
134  ret i32 %x
135
136if.false:
137  %cond3 = icmp slt i32 %a, %b
138  %y = select i1 %cond3, i32 %a, i32 %b
139  ret i32 %y
140}
141
142define i32 @test_04(i32 %a, i32 %b, i1 %c1, i1 %c2) {
143; CHECK-LABEL: @test_04(
144; CHECK-NEXT:  entry:
145; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
146; CHECK-NEXT:    [[AND_COND1:%.*]] = and i1 [[COND]], [[C1:%.*]]
147; CHECK-NEXT:    [[AND_COND2:%.*]] = and i1 [[AND_COND1]], [[C2:%.*]]
148; CHECK-NEXT:    br i1 [[AND_COND2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
149; CHECK:       if.true:
150; CHECK-NEXT:    ret i32 [[A]]
151; CHECK:       if.false:
152; CHECK-NEXT:    [[Y:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
153; CHECK-NEXT:    ret i32 [[Y]]
154;
155entry:
156  %cond = icmp slt i32 %a, %b
157  %and.cond1 = and i1 %cond, %c1
158  %and.cond2 = and i1 %and.cond1, %c2
159  br i1 %and.cond2, label %if.true, label %if.false
160
161if.true:
162  %cond2 = icmp slt i32 %a, %b
163  %x = select i1 %cond2, i32 %a, i32 %b
164  ret i32 %x
165
166if.false:
167  %cond3 = icmp slt i32 %a, %b
168  %y = select i1 %cond3, i32 %a, i32 %b
169  ret i32 %y
170}
171
172define i32 @test_04_select(i32 %a, i32 %b, i1 %c1, i1 %c2) {
173; CHECK-LABEL: @test_04_select(
174; CHECK-NEXT:  entry:
175; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
176; CHECK-NEXT:    [[AND_COND1:%.*]] = select i1 [[COND]], i1 [[C1:%.*]], i1 false
177; CHECK-NEXT:    [[AND_COND2:%.*]] = select i1 [[AND_COND1]], i1 [[C2:%.*]], i1 false
178; CHECK-NEXT:    br i1 [[AND_COND2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
179; CHECK:       if.true:
180; CHECK-NEXT:    ret i32 [[A]]
181; CHECK:       if.false:
182; CHECK-NEXT:    [[Y:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
183; CHECK-NEXT:    ret i32 [[Y]]
184;
185entry:
186  %cond = icmp slt i32 %a, %b
187  %and.cond1 = select i1 %cond, i1 %c1, i1 false
188  %and.cond2 = select i1 %and.cond1, i1 %c2, i1 false
189  br i1 %and.cond2, label %if.true, label %if.false
190
191if.true:
192  %cond2 = icmp slt i32 %a, %b
193  %x = select i1 %cond2, i32 %a, i32 %b
194  ret i32 %x
195
196if.false:
197  %cond3 = icmp slt i32 %a, %b
198  %y = select i1 %cond3, i32 %a, i32 %b
199  ret i32 %y
200}
201
202define i32 @test_05(i32 %a, i32 %b, i1 %c1, i1 %c2) {
203; CHECK-LABEL: @test_05(
204; CHECK-NEXT:  entry:
205; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
206; CHECK-NEXT:    [[OR_COND1:%.*]] = or i1 [[COND]], [[C1:%.*]]
207; CHECK-NEXT:    [[OR_COND2:%.*]] = or i1 [[OR_COND1]], [[C2:%.*]]
208; CHECK-NEXT:    br i1 [[OR_COND2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
209; CHECK:       if.true:
210; CHECK-NEXT:    [[X:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
211; CHECK-NEXT:    ret i32 [[X]]
212; CHECK:       if.false:
213; CHECK-NEXT:    ret i32 [[B]]
214;
215entry:
216  %cond = icmp slt i32 %a, %b
217  %or.cond1 = or i1 %cond, %c1
218  %or.cond2 = or i1 %or.cond1, %c2
219  br i1 %or.cond2, label %if.true, label %if.false
220
221if.true:
222  %cond2 = icmp slt i32 %a, %b
223  %x = select i1 %cond2, i32 %a, i32 %b
224  ret i32 %x
225
226if.false:
227  %cond3 = icmp slt i32 %a, %b
228  %y = select i1 %cond3, i32 %a, i32 %b
229  ret i32 %y
230}
231
232define i32 @test_05_select(i32 %a, i32 %b, i1 %c1, i1 %c2) {
233; CHECK-LABEL: @test_05_select(
234; CHECK-NEXT:  entry:
235; CHECK-NEXT:    [[COND:%.*]] = icmp slt i32 [[A:%.*]], [[B:%.*]]
236; CHECK-NEXT:    [[OR_COND1:%.*]] = select i1 [[COND]], i1 true, i1 [[C1:%.*]]
237; CHECK-NEXT:    [[OR_COND2:%.*]] = select i1 [[OR_COND1]], i1 true, i1 [[C2:%.*]]
238; CHECK-NEXT:    br i1 [[OR_COND2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
239; CHECK:       if.true:
240; CHECK-NEXT:    [[X:%.*]] = select i1 [[COND]], i32 [[A]], i32 [[B]]
241; CHECK-NEXT:    ret i32 [[X]]
242; CHECK:       if.false:
243; CHECK-NEXT:    ret i32 [[B]]
244;
245entry:
246  %cond = icmp slt i32 %a, %b
247  %or.cond1 = select i1 %cond, i1 true, i1 %c1
248  %or.cond2 = select i1 %or.cond1, i1 true, i1 %c2
249  br i1 %or.cond2, label %if.true, label %if.false
250
251if.true:
252  %cond2 = icmp slt i32 %a, %b
253  %x = select i1 %cond2, i32 %a, i32 %b
254  ret i32 %x
255
256if.false:
257  %cond3 = icmp slt i32 %a, %b
258  %y = select i1 %cond3, i32 %a, i32 %b
259  ret i32 %y
260}
261