xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/or-implied-by-operands.ll (revision fbcf8a8cbb2461730bfd0603b396842925a88ef2)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4define i1 @test_second_or_condition_implied_by_first(i8 %x) {
5; CHECK-LABEL: @test_second_or_condition_implied_by_first(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
8; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 5
9; CHECK-NEXT:    [[OR:%.*]] = or i1 true, [[T_1]]
10; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
11; CHECK:       then:
12; CHECK-NEXT:    ret i1 false
13; CHECK:       else:
14; CHECK-NEXT:    ret i1 true
15;
16entry:
17  %c.1 = icmp ule i8 %x, 10
18  %t.1 = icmp ugt i8 %x, 5
19  %or = or i1 %c.1, %t.1
20  br i1 %or, label %then, label %else
21
22then:
23  ret i1 0
24
25else:
26  ret i1 1
27}
28
29define i1 @test_first_or_condition_implied_by_second_ops(i8 %x) {
30; CHECK-LABEL: @test_first_or_condition_implied_by_second_ops(
31; CHECK-NEXT:  entry:
32; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
33; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 5
34; CHECK-NEXT:    [[OR:%.*]] = or i1 [[T_1]], true
35; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
36; CHECK:       then:
37; CHECK-NEXT:    ret i1 false
38; CHECK:       else:
39; CHECK-NEXT:    ret i1 true
40;
41entry:
42  %c.1 = icmp ule i8 %x, 10
43  %t.1 = icmp ugt i8 %x, 5
44  %or = or i1 %t.1, %c.1
45  br i1 %or, label %then, label %else
46
47then:
48  ret i1 0
49
50else:
51  ret i1 1
52}
53
54define i1 @test_second_or_condition_implied_by_first_select_form(i8 %x) {
55; CHECK-LABEL: @test_second_or_condition_implied_by_first_select_form(
56; CHECK-NEXT:  entry:
57; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
58; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 5
59; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C_1]], i1 false, i1 [[T_1]]
60; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
61; CHECK:       then:
62; CHECK-NEXT:    ret i1 false
63; CHECK:       else:
64; CHECK-NEXT:    ret i1 true
65;
66entry:
67  %c.1 = icmp ule i8 %x, 10
68  %t.1 = icmp ugt i8 %x, 5
69  %or = select i1 %c.1, i1 false, i1 %t.1
70  br i1 %or, label %then, label %else
71
72then:
73  ret i1 0
74
75else:
76  ret i1 1
77}
78
79define i1 @test_first_or_condition_implied_by_second_select_form(i8 %x) {
80; CHECK-LABEL: @test_first_or_condition_implied_by_second_select_form(
81; CHECK-NEXT:  entry:
82; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
83; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 5
84; CHECK-NEXT:    [[OR:%.*]] = select i1 [[T_1]], i1 false, i1 [[C_1]]
85; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
86; CHECK:       then:
87; CHECK-NEXT:    ret i1 false
88; CHECK:       else:
89; CHECK-NEXT:    ret i1 true
90;
91entry:
92  %c.1 = icmp ule i8 %x, 10
93  %t.1 = icmp ugt i8 %x, 5
94  %or = select i1 %t.1, i1 false, i1 %c.1
95  br i1 %or, label %then, label %else
96
97then:
98  ret i1 0
99
100else:
101  ret i1 1
102}
103
104define i1 @test_same_cond_for_or(i8 %x) {
105; CHECK-LABEL: @test_same_cond_for_or(
106; CHECK-NEXT:  entry:
107; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
108; CHECK-NEXT:    [[OR:%.*]] = or i1 false, [[C_1]]
109; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
110; CHECK:       then:
111; CHECK-NEXT:    ret i1 false
112; CHECK:       else:
113; CHECK-NEXT:    ret i1 true
114;
115entry:
116  %c.1 = icmp ugt i8 %x, 10
117  %or = or i1 %c.1, %c.1
118  br i1 %or, label %then, label %else
119
120then:
121  ret i1 0
122
123else:
124  ret i1 1
125}
126
127define i1 @test_same_cond_for_or_select_form(i8 %x) {
128; CHECK-LABEL: @test_same_cond_for_or_select_form(
129; CHECK-NEXT:  entry:
130; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
131; CHECK-NEXT:    [[OR:%.*]] = select i1 [[C_1]], i1 false, i1 [[C_1]]
132; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
133; CHECK:       then:
134; CHECK-NEXT:    ret i1 false
135; CHECK:       else:
136; CHECK-NEXT:    ret i1 true
137;
138entry:
139  %c.1 = icmp ugt i8 %x, 10
140  %or = select i1 %c.1, i1 false, i1 %c.1
141  br i1 %or, label %then, label %else
142
143then:
144  ret i1 0
145
146else:
147  ret i1 1
148}
149
150define i1 @test_second_or_condition_not_implied_by_first(i8 %x) {
151; CHECK-LABEL: @test_second_or_condition_not_implied_by_first(
152; CHECK-NEXT:  entry:
153; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
154; CHECK-NEXT:    [[C_2:%.*]] = icmp ugt i8 [[X]], 5
155; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_2]], false
156; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
157; CHECK:       then:
158; CHECK-NEXT:    ret i1 false
159; CHECK:       else:
160; CHECK-NEXT:    ret i1 true
161;
162entry:
163  %c.1 = icmp ugt i8 %x, 10
164  %c.2 = icmp ugt i8 %x, 5
165  %or = or i1 %c.2, %c.1
166  br i1 %or, label %then, label %else
167
168then:
169  ret i1 0
170
171else:
172  ret i1 1
173}
174
175define i1 @test_remove_variables(i1 %c, ptr %A, i64 %B, ptr %C) {
176; CHECK-LABEL: @test_remove_variables(
177; CHECK-NEXT:  entry:
178; CHECK-NEXT:    br i1 [[C:%.*]], label [[THEN_1:%.*]], label [[EXIT:%.*]]
179; CHECK:       then.1:
180; CHECK-NEXT:    [[TMP0:%.*]] = load ptr, ptr [[C:%.*]], align 8
181; CHECK-NEXT:    [[C_1:%.*]] = icmp ult ptr [[TMP0]], [[A:%.*]]
182; CHECK-NEXT:    br i1 [[C_1]], label [[THEN_2:%.*]], label [[ELSE_2:%.*]]
183; CHECK:       then.2:
184; CHECK-NEXT:    [[C_3:%.*]] = icmp sgt i64 [[B:%.*]], 0
185; CHECK-NEXT:    [[OR:%.*]] = or i1 true, [[C_3]]
186; CHECK-NEXT:    ret i1 [[OR]]
187; CHECK:       else.2:
188; CHECK-NEXT:    ret i1 false
189; CHECK:       exit:
190; CHECK-NEXT:    ret i1 true
191;
192entry:
193  br i1 %c, label %then.1, label %exit
194
195then.1:
196  %0 = load ptr, ptr %C, align 8
197  %c.1 = icmp ult ptr %0, %A
198  br i1 %c.1, label %then.2, label %else.2
199
200then.2:
201  %c.2 = icmp ne ptr %A, null
202  %c.3 = icmp sgt i64 %B, 0
203  %or = or i1 %c.2, %c.3
204  ret i1 %or
205
206else.2:
207  ret i1 0
208
209exit:
210  %t = icmp eq ptr null, null
211  ret i1 %t
212}
213
214define i1 @test_or_op_0_simplified(i32 %v) {
215; CHECK-LABEL: @test_or_op_0_simplified(
216; CHECK-NEXT:  entry:
217; CHECK-NEXT:    [[C_1:%.*]] = icmp sgt i32 [[V:%.*]], 0
218; CHECK-NEXT:    [[OR:%.*]] = or i1 false, [[C_1]]
219; CHECK-NEXT:    ret i1 [[OR]]
220;
221entry:
222  %c.1 = icmp sgt i32 %v, 0
223  %t.1 = icmp sgt i32 0, 0
224  %or = or i1 %t.1, %c.1
225  ret i1 %or
226}
227
228define i1 @test_or_op_1_simplified(i32 %v) {
229; CHECK-LABEL: @test_or_op_1_simplified(
230; CHECK-NEXT:  entry:
231; CHECK-NEXT:    [[C_1:%.*]] = icmp sgt i32 [[V:%.*]], 0
232; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_1]], false
233; CHECK-NEXT:    ret i1 [[OR]]
234;
235entry:
236  %c.1 = icmp sgt i32 %v, 0
237  %t.1 = icmp sgt i32 0, 0
238  %or = or i1 %c.1, %t.1
239  ret i1 %or
240}
241
242define i1 @test_or_used_in_false_branch(i8 %x) {
243; CHECK-LABEL: @test_or_used_in_false_branch(
244; CHECK-NEXT:  entry:
245; CHECK-NEXT:    [[C_1:%.*]] = icmp ule i8 [[X:%.*]], 10
246; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[X]], 5
247; CHECK-NEXT:    [[OR:%.*]] = or i1 [[C_1]], false
248; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
249; CHECK:       then:
250; CHECK-NEXT:    ret i1 [[T_1]]
251; CHECK:       else:
252; CHECK-NEXT:    ret i1 false
253;
254
255entry:
256  %c.1 = icmp ule i8 %x, 10
257  %t.1 = icmp ule i8 %x, 5
258  %or = or i1 %c.1, %t.1
259  br i1 %or, label %then, label %else
260
261then:
262  ret i1 %t.1
263
264else:
265  ret i1 %t.1
266}
267
268define i1 @test_or_used_in_false_branch2(i8 %x) {
269; CHECK-LABEL: @test_or_used_in_false_branch2(
270; CHECK-NEXT:  entry:
271; CHECK-NEXT:    [[C_1:%.*]] = icmp ugt i8 [[X:%.*]], 10
272; CHECK-NEXT:    [[T_1:%.*]] = icmp ugt i8 [[X]], 5
273; CHECK-NEXT:    [[OR:%.*]] = or i1 false, [[T_1]]
274; CHECK-NEXT:    br i1 [[OR]], label [[THEN:%.*]], label [[ELSE:%.*]]
275; CHECK:       then:
276; CHECK-NEXT:    ret i1 [[T_1]]
277; CHECK:       else:
278; CHECK-NEXT:    ret i1 false
279;
280
281entry:
282  %c.1 = icmp ugt i8 %x, 10
283  %t.1 = icmp ugt i8 %x, 5
284  %or = or i1 %c.1, %t.1
285  br i1 %or, label %then, label %else
286
287then:
288  ret i1 %t.1
289
290else:
291  ret i1 %t.1
292}
293
294define i1 @select_or_set_operand(ptr noundef %a, ptr noundef %b) {
295; CHECK-LABEL: @select_or_set_operand(
296; CHECK-NEXT:  entry:
297; CHECK-NEXT:    [[CMP_EQ:%.*]] = icmp eq ptr [[A:%.*]], [[B:%.*]]
298; CHECK-NEXT:    [[INCDEC_PTR12_I:%.*]] = getelementptr inbounds i32, ptr [[A]], i64 1
299; CHECK-NEXT:    [[CMP_EQ_1:%.*]] = icmp eq ptr [[INCDEC_PTR12_I]], [[B]]
300; CHECK-NEXT:    [[OR:%.*]] = select i1 [[CMP_EQ]], i1 true, i1 [[CMP_EQ_1]]
301; CHECK-NEXT:    ret i1 [[OR]]
302;
303entry:
304  %cmp.eq = icmp eq ptr %a, %b
305  %incdec.ptr12.i = getelementptr inbounds i32, ptr %a, i64 1
306  %cmp.eq.1 = icmp eq ptr %incdec.ptr12.i, %b
307  %or = select i1 %cmp.eq, i1 true, i1 %cmp.eq.1
308  ret i1 %or
309}
310