xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/eq.ll (revision 7fb97bee9269f0d4239908ac8def70be696991c6)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4declare void @llvm.assume(i1)
5
6define i1 @test_eq_1(i8 %a, i8 %b) {
7; CHECK-LABEL: @test_eq_1(
8; CHECK-NEXT:  entry:
9; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]]
10; CHECK-NEXT:    br i1 [[CMP]], label [[THEN:%.*]], label [[ELSE:%.*]]
11; CHECK:       then:
12; CHECK-NEXT:    [[RES_1:%.*]] = xor i1 true, true
13; CHECK-NEXT:    [[RES_2:%.*]] = xor i1 [[RES_1]], true
14; CHECK-NEXT:    [[RES_3:%.*]] = xor i1 [[RES_2]], true
15; CHECK-NEXT:    [[RES_4:%.*]] = xor i1 [[RES_3]], false
16; CHECK-NEXT:    [[RES_5:%.*]] = xor i1 [[RES_4]], false
17; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[B]], 99
18; CHECK-NEXT:    [[RES_6:%.*]] = xor i1 [[RES_5]], [[C_1]]
19; CHECK-NEXT:    ret i1 [[RES_6]]
20; CHECK:       else:
21; CHECK-NEXT:    [[F_3:%.*]] = icmp eq i8 [[A]], [[B]]
22; CHECK-NEXT:    [[F_4:%.*]] = icmp eq i8 [[B]], [[A]]
23; CHECK-NEXT:    [[RES_7:%.*]] = xor i1 [[F_3]], [[F_4]]
24; CHECK-NEXT:    [[C_2:%.*]] = icmp ult i8 [[B]], 99
25; CHECK-NEXT:    [[RES_8:%.*]] = xor i1 [[RES_7]], [[C_2]]
26; CHECK-NEXT:    [[C_3:%.*]] = icmp uge i8 [[A]], [[B]]
27; CHECK-NEXT:    [[RES_9:%.*]] = xor i1 [[RES_8]], [[C_3]]
28; CHECK-NEXT:    [[C_4:%.*]] = icmp ule i8 [[A]], [[B]]
29; CHECK-NEXT:    [[RES_10:%.*]] = xor i1 [[RES_9]], [[C_4]]
30; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[B]], [[A]]
31; CHECK-NEXT:    [[RES_11:%.*]] = xor i1 [[RES_10]], [[C_5]]
32; CHECK-NEXT:    [[C_6:%.*]] = icmp ult i8 [[B]], [[A]]
33; CHECK-NEXT:    [[RES_12:%.*]] = xor i1 [[RES_11]], [[C_6]]
34; CHECK-NEXT:    ret i1 [[RES_12]]
35;
36entry:
37  %cmp = icmp eq i8 %a, %b
38  br i1 %cmp, label %then, label %else
39
40then:
41  %t.1 = icmp uge i8 %a, %b
42  %t.2 = icmp ule i8 %a, %b
43  %res.1 = xor i1 %t.1, %t.2
44
45  %t.3 = icmp eq i8 %a, %b
46  %res.2 = xor i1 %res.1, %t.3
47
48  %t.4 = icmp eq i8 %b, %a
49  %res.3 = xor i1 %res.2, %t.4
50
51  %f.1 = icmp ugt i8 %b, %a
52  %res.4 = xor i1 %res.3, %f.1
53
54  %f.2 = icmp ult i8 %b, %a
55  %res.5 = xor i1 %res.4, %f.2
56
57  %c.1 = icmp ult i8 %b, 99
58  %res.6 = xor i1 %res.5, %c.1
59  ret i1 %res.6
60
61else:
62  %f.3 = icmp eq i8 %a, %b
63  %f.4 = icmp eq i8 %b, %a
64  %res.7 = xor i1 %f.3, %f.4
65
66  %c.2 = icmp ult i8 %b, 99
67  %res.8 = xor i1 %res.7, %c.2
68
69  %c.3 = icmp uge i8 %a, %b
70  %res.9 = xor i1 %res.8, %c.3
71
72  %c.4 = icmp ule i8 %a, %b
73  %res.10 = xor i1 %res.9, %c.4
74
75  %c.5 = icmp ugt i8 %b, %a
76  %res.11 = xor i1 %res.10, %c.5
77
78  %c.6 = icmp ult i8 %b, %a
79  %res.12 = xor i1 %res.11, %c.6
80  ret i1 %res.12
81}
82
83define i1 @test_eq_2(i8 %a, i8 %b) {
84; CHECK-LABEL: @test_eq_2(
85; CHECK-NEXT:  entry:
86; CHECK-NEXT:    [[PRE_1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]]
87; CHECK-NEXT:    br i1 [[PRE_1]], label [[THEN:%.*]], label [[ELSE:%.*]]
88; CHECK:       then:
89; CHECK-NEXT:    [[PRE_3:%.*]] = icmp ult i8 [[B]], 100
90; CHECK-NEXT:    br i1 [[PRE_3]], label [[THEN_THEN:%.*]], label [[THEN_ELSE:%.*]]
91; CHECK:       then.then:
92; CHECK-NEXT:    [[XOR_1:%.*]] = xor i1 true, true
93; CHECK-NEXT:    [[XOR_2:%.*]] = xor i1 [[XOR_1]], false
94; CHECK-NEXT:    [[XOR_3:%.*]] = xor i1 [[XOR_2]], false
95; CHECK-NEXT:    [[XOR_4:%.*]] = xor i1 [[XOR_3]], false
96; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[A]], 99
97; CHECK-NEXT:    [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]]
98; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[A]], 98
99; CHECK-NEXT:    [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]]
100; CHECK-NEXT:    ret i1 [[XOR_6]]
101; CHECK:       then.else:
102; CHECK-NEXT:    [[XOR_7:%.*]] = xor i1 false, false
103; CHECK-NEXT:    [[XOR_8:%.*]] = xor i1 [[XOR_7]], true
104; CHECK-NEXT:    [[XOR_9:%.*]] = xor i1 [[XOR_8]], true
105; CHECK-NEXT:    [[XOR_10:%.*]] = xor i1 [[XOR_9]], true
106; CHECK-NEXT:    [[XOR_11:%.*]] = xor i1 [[XOR_10]], false
107; CHECK-NEXT:    [[XOR_12:%.*]] = xor i1 [[XOR_11]], true
108; CHECK-NEXT:    ret i1 [[XOR_12]]
109; CHECK:       else:
110; CHECK-NEXT:    [[CMP_2:%.*]] = icmp ult i8 [[A]], 100
111; CHECK-NEXT:    ret i1 [[CMP_2]]
112;
113entry:
114  %pre.1 = icmp eq i8 %a, %b
115  br i1 %pre.1, label %then, label %else
116
117then:
118  %pre.3 = icmp ult i8 %b, 100
119  br i1 %pre.3, label %then.then, label %then.else
120
121then.then:
122  %t.1 = icmp ult i8 %a, 100
123  %t.2 = icmp ult i8 %b, 100
124  %xor.1 = xor i1 %t.1, %t.2
125
126  %f.1 = icmp uge i8 %a, 100
127  %xor.2 = xor i1 %xor.1, %f.1
128
129  %f.2 = icmp uge i8 %b, 100
130  %xor.3 = xor i1 %xor.2, %f.2
131
132  %f.3.1 = icmp ugt i8 %a, 99
133  %xor.4 = xor i1 %xor.3, %f.3.1
134
135  %c.1 = icmp ult i8 %a, 99
136  %xor.5 = xor i1 %xor.4, %c.1
137
138  %c.2 = icmp ugt i8 %a, 98
139  %xor.6 = xor i1 %xor.5, %c.1
140
141  ret i1 %xor.6
142
143then.else:
144  %f.4 = icmp ult i8 %a, 100
145  %f.5 = icmp ult i8 %b, 100
146  %xor.7 = xor i1 %f.4, %f.5
147
148  %t.3 = icmp uge i8 %a, 100
149  %xor.8 = xor i1 %xor.7, %t.3
150
151  %t.4 = icmp uge i8 %b, 100
152  %xor.9 = xor i1 %xor.8, %t.4
153
154  %t.5 = icmp ugt i8 %a, 99
155  %xor.10 = xor i1 %xor.9, %t.5
156
157  %c.3 = icmp ult i8 %a, 99
158  %xor.11 = xor i1 %xor.10, %c.3
159
160  %c.4 = icmp ugt i8 %a, 98
161  %xor.12 = xor i1 %xor.11, %c.4
162
163  ret i1 %xor.12
164
165else:
166  %cmp.2 = icmp ult i8 %a, 100
167  ret i1 %cmp.2
168}
169
170; Test of explicitly using uge & ule instead of eq.
171define i1 @test_eq_as_uge_ule_(i8 %a, i8 %b) {
172; CHECK-LABEL: @test_eq_as_uge_ule_(
173; CHECK-NEXT:  entry:
174; CHECK-NEXT:    [[PRE_1:%.*]] = icmp uge i8 [[A:%.*]], [[B:%.*]]
175; CHECK-NEXT:    [[PRE_2:%.*]] = icmp ule i8 [[A]], [[B]]
176; CHECK-NEXT:    [[PRE_AND:%.*]] = and i1 [[PRE_1]], [[PRE_2]]
177; CHECK-NEXT:    br i1 [[PRE_AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
178; CHECK:       then:
179; CHECK-NEXT:    [[PRE_3:%.*]] = icmp ult i8 [[B]], 100
180; CHECK-NEXT:    br i1 [[PRE_3]], label [[THEN_THEN:%.*]], label [[THEN_ELSE:%.*]]
181; CHECK:       then.then:
182; CHECK-NEXT:    [[XOR_1:%.*]] = xor i1 true, true
183; CHECK-NEXT:    [[XOR_2:%.*]] = xor i1 [[XOR_1]], false
184; CHECK-NEXT:    [[XOR_3:%.*]] = xor i1 [[XOR_2]], false
185; CHECK-NEXT:    [[XOR_4:%.*]] = xor i1 [[XOR_3]], false
186; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[A]], 99
187; CHECK-NEXT:    [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]]
188; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[A]], 98
189; CHECK-NEXT:    [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]]
190; CHECK-NEXT:    ret i1 [[XOR_6]]
191; CHECK:       then.else:
192; CHECK-NEXT:    [[XOR_7:%.*]] = xor i1 false, false
193; CHECK-NEXT:    [[XOR_8:%.*]] = xor i1 [[XOR_7]], true
194; CHECK-NEXT:    [[XOR_9:%.*]] = xor i1 [[XOR_8]], true
195; CHECK-NEXT:    [[XOR_10:%.*]] = xor i1 [[XOR_9]], true
196; CHECK-NEXT:    [[XOR_11:%.*]] = xor i1 [[XOR_10]], false
197; CHECK-NEXT:    [[XOR_12:%.*]] = xor i1 [[XOR_11]], true
198; CHECK-NEXT:    ret i1 [[XOR_12]]
199; CHECK:       else:
200; CHECK-NEXT:    [[CMP_2:%.*]] = icmp ult i8 [[A]], 100
201; CHECK-NEXT:    ret i1 [[CMP_2]]
202;
203entry:
204  %pre.1 = icmp uge i8 %a, %b
205  %pre.2 = icmp ule i8 %a, %b
206  %pre.and = and i1 %pre.1, %pre.2
207  br i1 %pre.and, label %then, label %else
208
209then:
210  %pre.3 = icmp ult i8 %b, 100
211  br i1 %pre.3, label %then.then, label %then.else
212
213then.then:
214  %t.1 = icmp ult i8 %a, 100
215  %t.2 = icmp ult i8 %b, 100
216  %xor.1 = xor i1 %t.1, %t.2
217
218  %f.1 = icmp uge i8 %a, 100
219  %xor.2 = xor i1 %xor.1, %f.1
220
221  %f.2 = icmp uge i8 %b, 100
222  %xor.3 = xor i1 %xor.2, %f.2
223
224  %f.3.1 = icmp ugt i8 %a, 99
225  %xor.4 = xor i1 %xor.3, %f.3.1
226
227  %c.1 = icmp ult i8 %a, 99
228  %xor.5 = xor i1 %xor.4, %c.1
229
230  %c.2 = icmp ugt i8 %a, 98
231  %xor.6 = xor i1 %xor.5, %c.1
232
233  ret i1 %xor.6
234
235then.else:
236  %f.4 = icmp ult i8 %a, 100
237  %f.5 = icmp ult i8 %b, 100
238  %xor.7 = xor i1 %f.4, %f.5
239
240  %t.3 = icmp uge i8 %a, 100
241  %xor.8 = xor i1 %xor.7, %t.3
242
243  %t.4 = icmp uge i8 %b, 100
244  %xor.9 = xor i1 %xor.8, %t.4
245
246  %t.5 = icmp ugt i8 %a, 99
247  %xor.10 = xor i1 %xor.9, %t.5
248
249  %c.3 = icmp ult i8 %a, 99
250  %xor.11 = xor i1 %xor.10, %c.3
251
252  %c.4 = icmp ugt i8 %a, 98
253  %xor.12 = xor i1 %xor.11, %c.4
254
255  ret i1 %xor.12
256
257else:
258  %cmp.2 = icmp ult i8 %a, 100
259  ret i1 %cmp.2
260}
261
262
263define i1 @test_eq_ult_and(i8 %a, i8 %b) {
264; CHECK-LABEL: @test_eq_ult_and(
265; CHECK-NEXT:  entry:
266; CHECK-NEXT:    [[PRE_1:%.*]] = icmp eq i8 [[A:%.*]], [[B:%.*]]
267; CHECK-NEXT:    [[PRE_2:%.*]] = icmp ult i8 [[B]], 100
268; CHECK-NEXT:    [[PRE_AND:%.*]] = and i1 [[PRE_1]], [[PRE_2]]
269; CHECK-NEXT:    br i1 [[PRE_AND]], label [[THEN:%.*]], label [[ELSE:%.*]]
270; CHECK:       then:
271; CHECK-NEXT:    [[XOR_1:%.*]] = xor i1 true, true
272; CHECK-NEXT:    [[XOR_2:%.*]] = xor i1 [[XOR_1]], false
273; CHECK-NEXT:    [[XOR_3:%.*]] = xor i1 [[XOR_2]], false
274; CHECK-NEXT:    [[XOR_4:%.*]] = xor i1 [[XOR_3]], false
275; CHECK-NEXT:    [[C_1:%.*]] = icmp ult i8 [[A]], 99
276; CHECK-NEXT:    [[XOR_5:%.*]] = xor i1 [[XOR_4]], [[C_1]]
277; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[A]], 98
278; CHECK-NEXT:    [[XOR_6:%.*]] = xor i1 [[XOR_5]], [[C_1]]
279; CHECK-NEXT:    ret i1 [[XOR_6]]
280; CHECK:       else:
281; CHECK-NEXT:    [[F_4:%.*]] = icmp ult i8 [[A]], 100
282; CHECK-NEXT:    [[F_5:%.*]] = icmp ult i8 [[B]], 100
283; CHECK-NEXT:    [[XOR_7:%.*]] = xor i1 [[F_4]], [[F_5]]
284; CHECK-NEXT:    [[T_3:%.*]] = icmp uge i8 [[A]], 100
285; CHECK-NEXT:    [[XOR_8:%.*]] = xor i1 [[XOR_7]], [[T_3]]
286; CHECK-NEXT:    [[T_4:%.*]] = icmp uge i8 [[B]], 100
287; CHECK-NEXT:    [[XOR_9:%.*]] = xor i1 [[XOR_8]], [[T_4]]
288; CHECK-NEXT:    [[T_5:%.*]] = icmp ugt i8 [[A]], 99
289; CHECK-NEXT:    [[XOR_10:%.*]] = xor i1 [[XOR_9]], [[T_5]]
290; CHECK-NEXT:    [[C_3:%.*]] = icmp ult i8 [[A]], 99
291; CHECK-NEXT:    [[XOR_11:%.*]] = xor i1 [[XOR_10]], [[C_3]]
292; CHECK-NEXT:    [[C_4:%.*]] = icmp ugt i8 [[A]], 98
293; CHECK-NEXT:    [[XOR_12:%.*]] = xor i1 [[XOR_11]], [[C_4]]
294; CHECK-NEXT:    ret i1 [[XOR_12]]
295;
296entry:
297  %pre.1 = icmp eq i8 %a, %b
298  %pre.2 = icmp ult i8 %b, 100
299  %pre.and = and i1 %pre.1, %pre.2
300  br i1 %pre.and, label %then, label %else
301
302then:
303  %t.1 = icmp ult i8 %a, 100
304  %t.2 = icmp ult i8 %b, 100
305  %xor.1 = xor i1 %t.1, %t.2
306
307  %f.1 = icmp uge i8 %a, 100
308  %xor.2 = xor i1 %xor.1, %f.1
309
310  %f.2 = icmp uge i8 %b, 100
311  %xor.3 = xor i1 %xor.2, %f.2
312
313  %f.3.1 = icmp ugt i8 %a, 99
314  %xor.4 = xor i1 %xor.3, %f.3.1
315
316  %c.1 = icmp ult i8 %a, 99
317  %xor.5 = xor i1 %xor.4, %c.1
318
319  %c.2 = icmp ugt i8 %a, 98
320  %xor.6 = xor i1 %xor.5, %c.1
321
322  ret i1 %xor.6
323
324else:
325  %f.4 = icmp ult i8 %a, 100
326  %f.5 = icmp ult i8 %b, 100
327  %xor.7 = xor i1 %f.4, %f.5
328
329  %t.3 = icmp uge i8 %a, 100
330  %xor.8 = xor i1 %xor.7, %t.3
331
332  %t.4 = icmp uge i8 %b, 100
333  %xor.9 = xor i1 %xor.8, %t.4
334
335  %t.5 = icmp ugt i8 %a, 99
336  %xor.10 = xor i1 %xor.9, %t.5
337
338  %c.3 = icmp ult i8 %a, 99
339  %xor.11 = xor i1 %xor.10, %c.3
340
341  %c.4 = icmp ugt i8 %a, 98
342  %xor.12 = xor i1 %xor.11, %c.4
343
344  ret i1 %xor.12
345}
346
347define i1 @assume_b_plus_1_ult_a(i64 %a, i64 %b)  {
348; CHECK-LABEL: @assume_b_plus_1_ult_a(
349; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i64 [[B:%.*]], 1
350; CHECK-NEXT:    [[TMP2:%.*]] = icmp ult i64 [[TMP1]], [[A:%.*]]
351; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
352; CHECK-NEXT:    ret i1 false
353;
354  %1 = add nuw i64 %b, 1
355  %2 = icmp ult i64 %1, %a
356  tail call void @llvm.assume(i1 %2)
357  %3 = icmp eq i64 %a, %b
358  ret i1 %3
359}
360
361define i1 @assume_a_plus_1_eq_b(i64 %a, i64 %b)  {
362; CHECK-LABEL: @assume_a_plus_1_eq_b(
363; CHECK-NEXT:    [[TMP1:%.*]] = add nuw i64 [[A:%.*]], 1
364; CHECK-NEXT:    [[TMP2:%.*]] = icmp eq i64 [[TMP1]], [[B:%.*]]
365; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
366; CHECK-NEXT:    ret i1 false
367;
368  %1 = add nuw i64 %a, 1
369  %2 = icmp eq i64 %1, %b
370  tail call void @llvm.assume(i1 %2)
371  %3 = icmp eq i64 %a, %b
372  ret i1 %3
373}
374
375define i1 @assume_a_ge_b_and_b_ge_c(i64 %a, i64 %b, i64 %c)  {
376; CHECK-LABEL: @assume_a_ge_b_and_b_ge_c(
377; CHECK-NEXT:    [[TMP1:%.*]] = icmp uge i64 [[A:%.*]], [[B:%.*]]
378; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP1]])
379; CHECK-NEXT:    [[TMP2:%.*]] = icmp uge i64 [[B]], [[C:%.*]]
380; CHECK-NEXT:    tail call void @llvm.assume(i1 [[TMP2]])
381; CHECK-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[A]], [[C]]
382; CHECK-NEXT:    ret i1 [[TMP3]]
383;
384  %1 = icmp uge i64 %a, %b
385  tail call void @llvm.assume(i1 %1)
386  %2 = icmp uge i64 %b, %c
387  tail call void @llvm.assume(i1 %2)
388  %3 = icmp eq i64 %a, %c
389  ret i1 %3
390}
391
392define i1 @test_transitivity_of_equality_and_plus_1(i64 %a, i64 %b, i64 %c) {
393; CHECK-LABEL: @test_transitivity_of_equality_and_plus_1(
394; CHECK-NEXT:  entry:
395; CHECK-NEXT:    [[PRE_1:%.*]] = icmp eq i64 [[A:%.*]], [[B:%.*]]
396; CHECK-NEXT:    br i1 [[PRE_1]], label [[AB_EQUAL:%.*]], label [[NOT_EQ:%.*]]
397; CHECK:       ab_equal:
398; CHECK-NEXT:    [[BC_EQ:%.*]] = icmp eq i64 [[B]], [[C:%.*]]
399; CHECK-NEXT:    br i1 [[BC_EQ]], label [[BC_EQUAL:%.*]], label [[NOT_EQ]]
400; CHECK:       bc_equal:
401; CHECK-NEXT:    [[A_PLUS_1:%.*]] = add nuw i64 [[A]], 1
402; CHECK-NEXT:    [[C_PLUS_1:%.*]] = add nuw i64 [[C]], 1
403; CHECK-NEXT:    [[RESULT:%.*]] = and i1 true, true
404; CHECK-NEXT:    ret i1 [[RESULT]]
405; CHECK:       not_eq:
406; CHECK-NEXT:    ret i1 false
407;
408entry:
409  %pre.1 = icmp eq i64 %a, %b
410  br i1 %pre.1, label %ab_equal, label %not_eq
411
412ab_equal:
413  %bc_eq = icmp eq i64 %b, %c
414  br i1 %bc_eq, label %bc_equal, label %not_eq
415
416bc_equal:
417  %ac_eq = icmp eq i64 %a, %c
418  %a_plus_1 = add nuw i64 %a, 1
419  %c_plus_1 = add nuw i64 %c, 1
420  %ac_plus_1_eq = icmp eq i64 %a_plus_1, %c_plus_1
421  %result = and i1 %ac_eq, %ac_plus_1_eq
422  ret i1 %result
423
424not_eq:
425  ret i1 false
426}
427
428define i1 @test_eq_for_signed_cmp(i32 noundef %v0, i32 noundef %v1, i32 noundef %v2)  {
429; CHECK-LABEL: @test_eq_for_signed_cmp(
430; CHECK-NEXT:  entry:
431; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[V2:%.*]], [[V0:%.*]]
432; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i32 [[V0]], [[V1:%.*]]
433; CHECK-NEXT:    [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]]
434; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]]
435; CHECK-NEXT:    [[AND1:%.*]] = and i1 false, [[AND0]]
436; CHECK-NEXT:    ret i1 [[AND1]]
437;
438entry:
439  %cmp = icmp eq i32 %v2, %v0
440  %cmp1 = icmp sge i32 %v0, %v1
441  %and0 = and i1 %cmp1, %cmp
442  %cmp4 = icmp sgt i32 %v1, %v2
443  %and1 = and i1 %cmp4, %and0
444  ret i1 %and1
445}
446
447define i1 @test_eq_for_signed_cmp_with_decompsition(i32 noundef %v0, i32 noundef %v1, i32 noundef %v2, i32 noundef %addend0, i32 noundef %addend1)  {
448; CHECK-LABEL: @test_eq_for_signed_cmp_with_decompsition(
449; CHECK-NEXT:  entry:
450; CHECK-NEXT:    [[V0ADD:%.*]] = add nsw i32 [[V0:%.*]], [[ADDEND0:%.*]]
451; CHECK-NEXT:    [[V1ADD:%.*]] = add nsw i32 [[V1:%.*]], [[ADDEND1:%.*]]
452; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[V2:%.*]], [[V0ADD]]
453; CHECK-NEXT:    [[CMP1:%.*]] = icmp sge i32 [[V0ADD]], [[V1ADD]]
454; CHECK-NEXT:    [[CMP2:%.*]] = icmp sge i32 [[ADDEND0]], 0
455; CHECK-NEXT:    [[CMP3:%.*]] = icmp slt i32 [[ADDEND0]], [[ADDEND1]]
456; CHECK-NEXT:    [[AND0:%.*]] = and i1 [[CMP1]], [[CMP]]
457; CHECK-NEXT:    [[AND1:%.*]] = and i1 [[AND0]], [[CMP2]]
458; CHECK-NEXT:    [[AND2:%.*]] = and i1 [[AND1]], [[CMP3]]
459; CHECK-NEXT:    [[CMP4:%.*]] = icmp sgt i32 [[V1]], [[V2]]
460; CHECK-NEXT:    [[AND3:%.*]] = and i1 false, [[AND2]]
461; CHECK-NEXT:    ret i1 [[AND3]]
462;
463entry:
464  %v0add = add nsw i32 %v0, %addend0
465  %v1add = add nsw i32 %v1, %addend1
466  %cmp = icmp eq i32 %v2, %v0add
467  %cmp1 = icmp sge i32 %v0add, %v1add
468  %cmp2 = icmp sge i32 %addend0, 0
469  %cmp3 = icmp slt i32 %addend0, %addend1
470  %and0 = and i1 %cmp1, %cmp
471  %and1 = and i1 %and0, %cmp2
472  %and2 = and i1 %and1, %cmp3
473  %cmp4 = icmp sgt i32 %v1, %v2
474  %and3 = and i1 %cmp4, %and2
475  ret i1 %and3
476}
477