[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / EarlyCSE / and_or.ll
blob2c04e7e3cf90512e58fbfc43629fae70fe81bc5c
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -early-cse -earlycse-debug-hash -S < %s | FileCheck %s
3 ; RUN: opt -basic-aa -early-cse-memssa -S < %s | FileCheck %s
5 define 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]]
15 entry:
16   %cond = icmp slt i32 %a, %b
17   br i1 %cond, label %if.true, label %if.false
19 if.true:
20   %cond2 = icmp slt i32 %a, %b
21   %x = select i1 %cond2, i32 %a, i32 %b
22   ret i32 %x
24 if.false:
25   %cond3 = icmp slt i32 %a, %b
26   %y = select i1 %cond3, i32 %a, i32 %b
27   ret i32 %y
30 define 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]]
42 entry:
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
47 if.true:
48   %cond2 = icmp slt i32 %a, %b
49   %x = select i1 %cond2, i32 %a, i32 %b
50   ret i32 %x
52 if.false:
53   %cond3 = icmp slt i32 %a, %b
54   %y = select i1 %cond3, i32 %a, i32 %b
55   ret i32 %y
58 define 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]]
70 entry:
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
75 if.true:
76   %cond2 = icmp slt i32 %a, %b
77   %x = select i1 %cond2, i32 %a, i32 %b
78   ret i32 %x
80 if.false:
81   %cond3 = icmp slt i32 %a, %b
82   %y = select i1 %cond3, i32 %a, i32 %b
83   ret i32 %y
86 define 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]]
98 entry:
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
103 if.true:
104   %cond2 = icmp slt i32 %a, %b
105   %x = select i1 %cond2, i32 %a, i32 %b
106   ret i32 %x
108 if.false:
109   %cond3 = icmp slt i32 %a, %b
110   %y = select i1 %cond3, i32 %a, i32 %b
111   ret i32 %y
114 define 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]]
126 entry:
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
131 if.true:
132   %cond2 = icmp slt i32 %a, %b
133   %x = select i1 %cond2, i32 %a, i32 %b
134   ret i32 %x
136 if.false:
137   %cond3 = icmp slt i32 %a, %b
138   %y = select i1 %cond3, i32 %a, i32 %b
139   ret i32 %y
142 define 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]]
155 entry:
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
161 if.true:
162   %cond2 = icmp slt i32 %a, %b
163   %x = select i1 %cond2, i32 %a, i32 %b
164   ret i32 %x
166 if.false:
167   %cond3 = icmp slt i32 %a, %b
168   %y = select i1 %cond3, i32 %a, i32 %b
169   ret i32 %y
172 define 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]]
185 entry:
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
191 if.true:
192   %cond2 = icmp slt i32 %a, %b
193   %x = select i1 %cond2, i32 %a, i32 %b
194   ret i32 %x
196 if.false:
197   %cond3 = icmp slt i32 %a, %b
198   %y = select i1 %cond3, i32 %a, i32 %b
199   ret i32 %y
202 define 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]]
215 entry:
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
221 if.true:
222   %cond2 = icmp slt i32 %a, %b
223   %x = select i1 %cond2, i32 %a, i32 %b
224   ret i32 %x
226 if.false:
227   %cond3 = icmp slt i32 %a, %b
228   %y = select i1 %cond3, i32 %a, i32 %b
229   ret i32 %y
232 define 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]]
245 entry:
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
251 if.true:
252   %cond2 = icmp slt i32 %a, %b
253   %x = select i1 %cond2, i32 %a, i32 %b
254   ret i32 %x
256 if.false:
257   %cond3 = icmp slt i32 %a, %b
258   %y = select i1 %cond3, i32 %a, i32 %b
259   ret i32 %y