Revert r354244 "[DAGCombiner] Eliminate dead stores to stack."
[llvm-complete.git] / test / Transforms / InstCombine / icmp-dom.ll
blob7676eaaf08baca11e3e3a5ffb4e06681246d591d
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -instcombine -S | FileCheck %s
4 define void @idom_sign_bit_check_edge_dominates(i64 %a) {
5 ; CHECK-LABEL: @idom_sign_bit_check_edge_dominates(
6 ; CHECK-NEXT:  entry:
7 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[A:%.*]], 0
8 ; CHECK-NEXT:    br i1 [[CMP]], label [[LAND_LHS_TRUE:%.*]], label [[LOR_RHS:%.*]]
9 ; CHECK:       land.lhs.true:
10 ; CHECK-NEXT:    br label [[LOR_END:%.*]]
11 ; CHECK:       lor.rhs:
12 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i64 [[A]], 0
13 ; CHECK-NEXT:    br i1 [[CMP2]], label [[LOR_END]], label [[LAND_RHS:%.*]]
14 ; CHECK:       land.rhs:
15 ; CHECK-NEXT:    br label [[LOR_END]]
16 ; CHECK:       lor.end:
17 ; CHECK-NEXT:    ret void
19 entry:
20   %cmp = icmp slt i64 %a, 0
21   br i1 %cmp, label %land.lhs.true, label %lor.rhs
23 land.lhs.true:
24   br label %lor.end
26 lor.rhs:
27   %cmp2 = icmp sgt i64 %a, 0
28   br i1 %cmp2, label %land.rhs, label %lor.end
30 land.rhs:
31   br label %lor.end
33 lor.end:
34   ret void
37 define void @idom_sign_bit_check_edge_not_dominates(i64 %a) {
38 ; CHECK-LABEL: @idom_sign_bit_check_edge_not_dominates(
39 ; CHECK-NEXT:  entry:
40 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[A:%.*]], 0
41 ; CHECK-NEXT:    br i1 [[CMP]], label [[LAND_LHS_TRUE:%.*]], label [[LOR_RHS:%.*]]
42 ; CHECK:       land.lhs.true:
43 ; CHECK-NEXT:    br i1 undef, label [[LOR_END:%.*]], label [[LOR_RHS]]
44 ; CHECK:       lor.rhs:
45 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp sgt i64 [[A]], 0
46 ; CHECK-NEXT:    br i1 [[CMP2]], label [[LAND_RHS:%.*]], label [[LOR_END]]
47 ; CHECK:       land.rhs:
48 ; CHECK-NEXT:    br label [[LOR_END]]
49 ; CHECK:       lor.end:
50 ; CHECK-NEXT:    ret void
52 entry:
53   %cmp = icmp slt i64 %a, 0
54   br i1 %cmp, label %land.lhs.true, label %lor.rhs
56 land.lhs.true:
57   br i1 undef, label %lor.end, label %lor.rhs
59 lor.rhs:
60   %cmp2 = icmp sgt i64 %a, 0
61   br i1 %cmp2, label %land.rhs, label %lor.end
63 land.rhs:
64   br label %lor.end
66 lor.end:
67   ret void
70 define void @idom_sign_bit_check_edge_dominates_select(i64 %a, i64 %b) {
71 ; CHECK-LABEL: @idom_sign_bit_check_edge_dominates_select(
72 ; CHECK-NEXT:  entry:
73 ; CHECK-NEXT:    [[CMP:%.*]] = icmp slt i64 [[A:%.*]], 5
74 ; CHECK-NEXT:    br i1 [[CMP]], label [[LAND_LHS_TRUE:%.*]], label [[LOR_RHS:%.*]]
75 ; CHECK:       land.lhs.true:
76 ; CHECK-NEXT:    br label [[LOR_END:%.*]]
77 ; CHECK:       lor.rhs:
78 ; CHECK-NEXT:    [[CMP3:%.*]] = icmp eq i64 [[A]], [[B:%.*]]
79 ; CHECK-NEXT:    br i1 [[CMP3]], label [[LOR_END]], label [[LAND_RHS:%.*]]
80 ; CHECK:       land.rhs:
81 ; CHECK-NEXT:    br label [[LOR_END]]
82 ; CHECK:       lor.end:
83 ; CHECK-NEXT:    ret void
85 entry:
86   %cmp = icmp slt i64 %a, 5
87   br i1 %cmp, label %land.lhs.true, label %lor.rhs
89 land.lhs.true:
90   br label %lor.end
92 lor.rhs:
93   %cmp2 = icmp sgt i64 %a, 5
94   %select = select i1 %cmp2, i64 %a, i64 5
95   %cmp3 = icmp ne i64 %select, %b
96   br i1 %cmp3, label %land.rhs, label %lor.end
98 land.rhs:
99   br label %lor.end
101 lor.end:
102   ret void
105 define void @idom_zbranch(i64 %a) {
106 ; CHECK-LABEL: @idom_zbranch(
107 ; CHECK-NEXT:  entry:
108 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i64 [[A:%.*]], 0
109 ; CHECK-NEXT:    br i1 [[CMP]], label [[LOR_END:%.*]], label [[LOR_RHS:%.*]]
110 ; CHECK:       lor.rhs:
111 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp slt i64 [[A]], 0
112 ; CHECK-NEXT:    br i1 [[CMP2]], label [[LAND_RHS:%.*]], label [[LOR_END]]
113 ; CHECK:       land.rhs:
114 ; CHECK-NEXT:    br label [[LOR_END]]
115 ; CHECK:       lor.end:
116 ; CHECK-NEXT:    ret void
118 entry:
119   %cmp = icmp sgt i64 %a, 0
120   br i1 %cmp, label %lor.end, label %lor.rhs
122 lor.rhs:
123   %cmp2 = icmp slt i64 %a, 0
124   br i1 %cmp2, label %land.rhs, label %lor.end
126 land.rhs:
127   br label %lor.end
129 lor.end:
130   ret void
133 define void @idom_not_zbranch(i32 %a, i32 %b) {
134 ; CHECK-LABEL: @idom_not_zbranch(
135 ; CHECK-NEXT:  entry:
136 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[A:%.*]], 0
137 ; CHECK-NEXT:    br i1 [[CMP]], label [[RETURN:%.*]], label [[IF_END:%.*]]
138 ; CHECK:       if.end:
139 ; CHECK-NEXT:    [[CMP2:%.*]] = icmp eq i32 [[A]], [[B:%.*]]
140 ; CHECK-NEXT:    br i1 [[CMP2]], label [[RETURN]], label [[IF_THEN3:%.*]]
141 ; CHECK:       if.then3:
142 ; CHECK-NEXT:    br label [[RETURN]]
143 ; CHECK:       return:
144 ; CHECK-NEXT:    ret void
146 entry:
147   %cmp = icmp sgt i32 %a, 0
148   br i1 %cmp, label %return, label %if.end
150 if.end:
151   %cmp1 = icmp slt i32 %a, 0
152   %a. = select i1 %cmp1, i32 %a, i32 0
153   %cmp2 = icmp ne i32 %a., %b
154   br i1 %cmp2, label %if.then3, label %return
156 if.then3:
157   br label %return
159 return:
160   ret void
163 define i1 @trueblock_cmp_is_false(i32 %x, i32 %y) {
164 ; CHECK-LABEL: @trueblock_cmp_is_false(
165 ; CHECK-NEXT:  entry:
166 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
167 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
168 ; CHECK:       t:
169 ; CHECK-NEXT:    ret i1 false
170 ; CHECK:       f:
171 ; CHECK-NEXT:    ret i1 [[CMP]]
173 entry:
174   %cmp = icmp sgt i32 %x, %y
175   br i1 %cmp, label %t, label %f
177   %cmp2 = icmp slt i32 %x, %y
178   ret i1 %cmp2
180   ret i1 %cmp
183 define i1 @trueblock_cmp_is_false_commute(i32 %x, i32 %y) {
184 ; CHECK-LABEL: @trueblock_cmp_is_false_commute(
185 ; CHECK-NEXT:  entry:
186 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
187 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
188 ; CHECK:       t:
189 ; CHECK-NEXT:    ret i1 false
190 ; CHECK:       f:
191 ; CHECK-NEXT:    ret i1 [[CMP]]
193 entry:
194   %cmp = icmp eq i32 %x, %y
195   br i1 %cmp, label %t, label %f
197   %cmp2 = icmp sgt i32 %y, %x
198   ret i1 %cmp2
200   ret i1 %cmp
203 define i1 @trueblock_cmp_is_true(i32 %x, i32 %y) {
204 ; CHECK-LABEL: @trueblock_cmp_is_true(
205 ; CHECK-NEXT:  entry:
206 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
207 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
208 ; CHECK:       t:
209 ; CHECK-NEXT:    ret i1 true
210 ; CHECK:       f:
211 ; CHECK-NEXT:    ret i1 [[CMP]]
213 entry:
214   %cmp = icmp ult i32 %x, %y
215   br i1 %cmp, label %t, label %f
217   %cmp2 = icmp ne i32 %x, %y
218   ret i1 %cmp2
220   ret i1 %cmp
223 define i1 @trueblock_cmp_is_true_commute(i32 %x, i32 %y) {
224 ; CHECK-LABEL: @trueblock_cmp_is_true_commute(
225 ; CHECK-NEXT:  entry:
226 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ugt i32 [[X:%.*]], [[Y:%.*]]
227 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
228 ; CHECK:       t:
229 ; CHECK-NEXT:    ret i1 true
230 ; CHECK:       f:
231 ; CHECK-NEXT:    ret i1 [[CMP]]
233 entry:
234   %cmp = icmp ugt i32 %x, %y
235   br i1 %cmp, label %t, label %f
237   %cmp2 = icmp ne i32 %y, %x
238   ret i1 %cmp2
240   ret i1 %cmp
243 define i1 @falseblock_cmp_is_false(i32 %x, i32 %y) {
244 ; CHECK-LABEL: @falseblock_cmp_is_false(
245 ; CHECK-NEXT:  entry:
246 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sle i32 [[X:%.*]], [[Y:%.*]]
247 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
248 ; CHECK:       t:
249 ; CHECK-NEXT:    ret i1 [[CMP]]
250 ; CHECK:       f:
251 ; CHECK-NEXT:    ret i1 false
253 entry:
254   %cmp = icmp sle i32 %x, %y
255   br i1 %cmp, label %t, label %f
257   ret i1 %cmp
259   %cmp2 = icmp slt i32 %x, %y
260   ret i1 %cmp2
263 define i1 @falseblock_cmp_is_false_commute(i32 %x, i32 %y) {
264 ; CHECK-LABEL: @falseblock_cmp_is_false_commute(
265 ; CHECK-NEXT:  entry:
266 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[X:%.*]], [[Y:%.*]]
267 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
268 ; CHECK:       t:
269 ; CHECK-NEXT:    ret i1 [[CMP]]
270 ; CHECK:       f:
271 ; CHECK-NEXT:    ret i1 false
273 entry:
274   %cmp = icmp eq i32 %x, %y
275   br i1 %cmp, label %t, label %f
277   ret i1 %cmp
279   %cmp2 = icmp eq i32 %y, %x
280   ret i1 %cmp2
283 define i1 @falseblock_cmp_is_true(i32 %x, i32 %y) {
284 ; CHECK-LABEL: @falseblock_cmp_is_true(
285 ; CHECK-NEXT:  entry:
286 ; CHECK-NEXT:    [[CMP:%.*]] = icmp ult i32 [[X:%.*]], [[Y:%.*]]
287 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
288 ; CHECK:       t:
289 ; CHECK-NEXT:    ret i1 [[CMP]]
290 ; CHECK:       f:
291 ; CHECK-NEXT:    ret i1 true
293 entry:
294   %cmp = icmp ult i32 %x, %y
295   br i1 %cmp, label %t, label %f
297   ret i1 %cmp
299   %cmp2 = icmp uge i32 %x, %y
300   ret i1 %cmp2
303 define i1 @falseblock_cmp_is_true_commute(i32 %x, i32 %y) {
304 ; CHECK-LABEL: @falseblock_cmp_is_true_commute(
305 ; CHECK-NEXT:  entry:
306 ; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i32 [[X:%.*]], [[Y:%.*]]
307 ; CHECK-NEXT:    br i1 [[CMP]], label [[T:%.*]], label [[F:%.*]]
308 ; CHECK:       t:
309 ; CHECK-NEXT:    ret i1 [[CMP]]
310 ; CHECK:       f:
311 ; CHECK-NEXT:    ret i1 true
313 entry:
314   %cmp = icmp sgt i32 %x, %y
315   br i1 %cmp, label %t, label %f
317   ret i1 %cmp
319   %cmp2 = icmp sge i32 %y, %x
320   ret i1 %cmp2