xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/add.ll (revision 6778e2f4418eea7f8fa44fb1f9b0aaeca8eacfe1)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s
3
4define void @test.not.uge.ult(i8 %start, i8 %low, i8 %high) {
5; CHECK-LABEL: @test.not.uge.ult(
6; CHECK-NEXT:  entry:
7; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add i8 [[START:%.*]], 3
8; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
9; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
10; CHECK:       if.then:
11; CHECK-NEXT:    ret void
12; CHECK:       if.end:
13; CHECK-NEXT:    [[T_0:%.*]] = icmp ult i8 [[START]], [[HIGH]]
14; CHECK-NEXT:    call void @use(i1 [[T_0]])
15; CHECK-NEXT:    [[START_1:%.*]] = add i8 [[START]], 1
16; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i8 [[START_1]], [[HIGH]]
17; CHECK-NEXT:    call void @use(i1 [[T_1]])
18; CHECK-NEXT:    [[START_2:%.*]] = add i8 [[START]], 2
19; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i8 [[START_2]], [[HIGH]]
20; CHECK-NEXT:    call void @use(i1 [[T_2]])
21; CHECK-NEXT:    [[START_3:%.*]] = add i8 [[START]], 3
22; CHECK-NEXT:    [[T_3:%.*]] = icmp ult i8 [[START_3]], [[HIGH]]
23; CHECK-NEXT:    call void @use(i1 [[T_3]])
24; CHECK-NEXT:    [[START_4:%.*]] = add i8 [[START]], 4
25; CHECK-NEXT:    [[C_4:%.*]] = icmp ult i8 [[START_4]], [[HIGH]]
26; CHECK-NEXT:    call void @use(i1 [[C_4]])
27; CHECK-NEXT:    ret void
28;
29entry:
30  %add.ptr.i = add i8 %start, 3
31  %c.1 = icmp uge i8 %add.ptr.i, %high
32  br i1 %c.1, label %if.then, label %if.end
33
34if.then:                                          ; preds = %entry
35  ret void
36
37if.end:                                           ; preds = %entry
38  %t.0 = icmp ult i8 %start, %high
39  call void @use(i1 %t.0)
40  %start.1 = add i8 %start, 1
41  %t.1 = icmp ult i8 %start.1, %high
42  call void @use(i1 %t.1)
43  %start.2 = add i8 %start, 2
44  %t.2 = icmp ult i8 %start.2, %high
45  call void @use(i1 %t.2)
46  %start.3 = add i8 %start, 3
47  %t.3 = icmp ult i8 %start.3, %high
48  call void @use(i1 %t.3)
49  %start.4 = add i8 %start, 4
50  %c.4 = icmp ult i8 %start.4, %high
51  call void @use(i1 %c.4)
52  ret void
53}
54
55define void @test.not.sge.ult(i8 %start, i8 %low, i8 %high) {
56; CHECK-LABEL: @test.not.sge.ult(
57; CHECK-NEXT:  entry:
58; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add i8 [[START:%.*]], 3
59; CHECK-NEXT:    [[C_1:%.*]] = icmp sge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
60; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
61; CHECK:       if.then:
62; CHECK-NEXT:    ret void
63; CHECK:       if.end:
64; CHECK-NEXT:    [[T_0:%.*]] = icmp slt i8 [[START]], [[HIGH]]
65; CHECK-NEXT:    call void @use(i1 [[T_0]])
66; CHECK-NEXT:    [[START_1:%.*]] = add i8 [[START]], 1
67; CHECK-NEXT:    [[T_1:%.*]] = icmp slt i8 [[START_1]], [[HIGH]]
68; CHECK-NEXT:    call void @use(i1 [[T_1]])
69; CHECK-NEXT:    [[START_2:%.*]] = add i8 [[START]], 2
70; CHECK-NEXT:    [[T_2:%.*]] = icmp slt i8 [[START_2]], [[HIGH]]
71; CHECK-NEXT:    call void @use(i1 [[T_2]])
72; CHECK-NEXT:    [[START_3:%.*]] = add i8 [[START]], 3
73; CHECK-NEXT:    [[T_3:%.*]] = icmp slt i8 [[START_3]], [[HIGH]]
74; CHECK-NEXT:    call void @use(i1 [[T_3]])
75; CHECK-NEXT:    [[START_4:%.*]] = add i8 [[START]], 4
76; CHECK-NEXT:    [[C_4:%.*]] = icmp slt i8 [[START_4]], [[HIGH]]
77; CHECK-NEXT:    call void @use(i1 [[C_4]])
78; CHECK-NEXT:    ret void
79;
80entry:
81  %add.ptr.i = add i8 %start, 3
82  %c.1 = icmp sge i8 %add.ptr.i, %high
83  br i1 %c.1, label %if.then, label %if.end
84
85if.then:                                          ; preds = %entry
86  ret void
87
88if.end:                                           ; preds = %entry
89  %t.0 = icmp slt i8 %start, %high
90  call void @use(i1 %t.0)
91  %start.1 = add i8 %start, 1
92  %t.1 = icmp slt i8 %start.1, %high
93  call void @use(i1 %t.1)
94  %start.2 = add i8 %start, 2
95  %t.2 = icmp slt i8 %start.2, %high
96  call void @use(i1 %t.2)
97  %start.3 = add i8 %start, 3
98  %t.3 = icmp slt i8 %start.3, %high
99  call void @use(i1 %t.3)
100  %start.4 = add i8 %start, 4
101  %c.4 = icmp slt i8 %start.4, %high
102  call void @use(i1 %c.4)
103  ret void
104}
105
106define void @test.not.uge.ule(i8 %start, i8 %low, i8 %high) {
107; CHECK-LABEL: @test.not.uge.ule(
108; CHECK-NEXT:  entry:
109; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add i8 [[START:%.*]], 3
110; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
111; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
112; CHECK:       if.then:
113; CHECK-NEXT:    ret void
114; CHECK:       if.end:
115; CHECK-NEXT:    [[T_0:%.*]] = icmp ule i8 [[START]], [[HIGH]]
116; CHECK-NEXT:    call void @use(i1 [[T_0]])
117; CHECK-NEXT:    [[START_1:%.*]] = add i8 [[START]], 1
118; CHECK-NEXT:    [[T_1:%.*]] = icmp ule i8 [[START_1]], [[HIGH]]
119; CHECK-NEXT:    call void @use(i1 [[T_1]])
120; CHECK-NEXT:    [[START_2:%.*]] = add i8 [[START]], 2
121; CHECK-NEXT:    [[T_2:%.*]] = icmp ule i8 [[START_2]], [[HIGH]]
122; CHECK-NEXT:    call void @use(i1 [[T_2]])
123; CHECK-NEXT:    [[START_3:%.*]] = add i8 [[START]], 3
124; CHECK-NEXT:    [[T_3:%.*]] = icmp ule i8 [[START_3]], [[HIGH]]
125; CHECK-NEXT:    call void @use(i1 [[T_3]])
126; CHECK-NEXT:    [[START_4:%.*]] = add i8 [[START]], 4
127; CHECK-NEXT:    [[T_4:%.*]] = icmp ule i8 [[START_4]], [[HIGH]]
128; CHECK-NEXT:    call void @use(i1 [[T_4]])
129; CHECK-NEXT:    [[START_5:%.*]] = add i8 [[START]], 5
130; CHECK-NEXT:    [[C_5:%.*]] = icmp ule i8 [[START_5]], [[HIGH]]
131; CHECK-NEXT:    call void @use(i1 [[C_5]])
132; CHECK-NEXT:    ret void
133;
134entry:
135  %add.ptr.i = add i8 %start, 3
136  %c.1 = icmp uge i8 %add.ptr.i, %high
137  br i1 %c.1, label %if.then, label %if.end
138
139if.then:                                          ; preds = %entry
140  ret void
141
142if.end:                                           ; preds = %entry
143  %t.0 = icmp ule i8 %start, %high
144  call void @use(i1 %t.0)
145  %start.1 = add i8 %start, 1
146  %t.1 = icmp ule i8 %start.1, %high
147  call void @use(i1 %t.1)
148  %start.2 = add i8 %start, 2
149  %t.2 = icmp ule i8 %start.2, %high
150  call void @use(i1 %t.2)
151  %start.3 = add i8 %start, 3
152  %t.3 = icmp ule i8 %start.3, %high
153  call void @use(i1 %t.3)
154  %start.4 = add i8 %start, 4
155  %t.4 = icmp ule i8 %start.4, %high
156  call void @use(i1 %t.4)
157
158  %start.5 = add i8 %start, 5
159  %c.5 = icmp ule i8 %start.5, %high
160  call void @use(i1 %c.5)
161
162  ret void
163}
164
165define void @test.not.uge.ugt(i8 %start, i8 %low, i8 %high) {
166; CHECK-LABEL: @test.not.uge.ugt(
167; CHECK-NEXT:  entry:
168; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add i8 [[START:%.*]], 3
169; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
170; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
171; CHECK:       if.then:
172; CHECK-NEXT:    ret void
173; CHECK:       if.end:
174; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
175; CHECK-NEXT:    call void @use(i1 [[F_0]])
176; CHECK-NEXT:    [[START_1:%.*]] = add i8 [[START]], 1
177; CHECK-NEXT:    [[F_1:%.*]] = icmp ugt i8 [[START_1]], [[HIGH]]
178; CHECK-NEXT:    call void @use(i1 [[F_1]])
179; CHECK-NEXT:    [[START_2:%.*]] = add i8 [[START]], 2
180; CHECK-NEXT:    [[F_2:%.*]] = icmp ugt i8 [[START_2]], [[HIGH]]
181; CHECK-NEXT:    call void @use(i1 [[F_2]])
182; CHECK-NEXT:    [[START_3:%.*]] = add i8 [[START]], 3
183; CHECK-NEXT:    [[F_3:%.*]] = icmp ugt i8 [[START_3]], [[HIGH]]
184; CHECK-NEXT:    call void @use(i1 [[F_3]])
185; CHECK-NEXT:    [[START_4:%.*]] = add i8 [[START]], 4
186; CHECK-NEXT:    [[F_4:%.*]] = icmp ugt i8 [[START_4]], [[HIGH]]
187; CHECK-NEXT:    call void @use(i1 [[F_4]])
188; CHECK-NEXT:    [[START_5:%.*]] = add i8 [[START]], 5
189; CHECK-NEXT:    [[C_5:%.*]] = icmp ugt i8 [[START_5]], [[HIGH]]
190; CHECK-NEXT:    call void @use(i1 [[C_5]])
191; CHECK-NEXT:    ret void
192;
193entry:
194  %add.ptr.i = add i8 %start, 3
195  %c.1 = icmp uge i8 %add.ptr.i, %high
196  br i1 %c.1, label %if.then, label %if.end
197
198if.then:                                          ; preds = %entry
199  ret void
200
201if.end:                                           ; preds = %entry
202  %f.0 = icmp ugt i8 %start, %high
203  call void @use(i1 %f.0)
204
205  %start.1 = add i8 %start, 1
206  %f.1 = icmp ugt i8 %start.1, %high
207  call void @use(i1 %f.1)
208
209  %start.2 = add i8 %start, 2
210  %f.2 = icmp ugt i8 %start.2, %high
211  call void @use(i1 %f.2)
212
213  %start.3 = add i8 %start, 3
214  %f.3 = icmp ugt i8 %start.3, %high
215  call void @use(i1 %f.3)
216
217  %start.4 = add i8 %start, 4
218  %f.4 = icmp ugt i8 %start.4, %high
219  call void @use(i1 %f.4)
220
221  %start.5 = add i8 %start, 5
222  %c.5 = icmp ugt i8 %start.5, %high
223  call void @use(i1 %c.5)
224
225  ret void
226}
227
228define void @test.not.uge.uge(i8 %start, i8 %low, i8 %high) {
229; CHECK-LABEL: @test.not.uge.uge(
230; CHECK-NEXT:  entry:
231; CHECK-NEXT:    [[ADD_PTR_I:%.*]] = add i8 [[START:%.*]], 3
232; CHECK-NEXT:    [[C_1:%.*]] = icmp uge i8 [[ADD_PTR_I]], [[HIGH:%.*]]
233; CHECK-NEXT:    br i1 [[C_1]], label [[IF_THEN:%.*]], label [[IF_END:%.*]]
234; CHECK:       if.then:
235; CHECK-NEXT:    ret void
236; CHECK:       if.end:
237; CHECK-NEXT:    [[F_0:%.*]] = icmp ugt i8 [[START]], [[HIGH]]
238; CHECK-NEXT:    call void @use(i1 [[F_0]])
239; CHECK-NEXT:    [[START_1:%.*]] = add i8 [[START]], 1
240; CHECK-NEXT:    [[F_1:%.*]] = icmp uge i8 [[START_1]], [[HIGH]]
241; CHECK-NEXT:    call void @use(i1 [[F_1]])
242; CHECK-NEXT:    [[START_2:%.*]] = add i8 [[START]], 2
243; CHECK-NEXT:    [[F_2:%.*]] = icmp uge i8 [[START_2]], [[HIGH]]
244; CHECK-NEXT:    call void @use(i1 [[F_2]])
245; CHECK-NEXT:    [[START_3:%.*]] = add i8 [[START]], 3
246; CHECK-NEXT:    [[F_3:%.*]] = icmp uge i8 [[START_3]], [[HIGH]]
247; CHECK-NEXT:    call void @use(i1 [[F_3]])
248; CHECK-NEXT:    [[START_4:%.*]] = add i8 [[START]], 4
249; CHECK-NEXT:    [[C_4:%.*]] = icmp uge i8 [[START_4]], [[HIGH]]
250; CHECK-NEXT:    call void @use(i1 [[C_4]])
251; CHECK-NEXT:    [[START_5:%.*]] = add i8 [[START]], 5
252; CHECK-NEXT:    [[C_5:%.*]] = icmp uge i8 [[START_5]], [[HIGH]]
253; CHECK-NEXT:    call void @use(i1 [[C_5]])
254; CHECK-NEXT:    ret void
255;
256entry:
257  %add.ptr.i = add i8 %start, 3
258  %c.1 = icmp uge i8 %add.ptr.i, %high
259  br i1 %c.1, label %if.then, label %if.end
260
261if.then:                                          ; preds = %entry
262  ret void
263
264if.end:                                           ; preds = %entry
265  %f.0 = icmp ugt i8 %start, %high
266  call void @use(i1 %f.0)
267
268  %start.1 = add i8 %start, 1
269  %f.1 = icmp uge i8 %start.1, %high
270  call void @use(i1 %f.1)
271
272  %start.2 = add i8 %start, 2
273  %f.2 = icmp uge i8 %start.2, %high
274  call void @use(i1 %f.2)
275
276  %start.3 = add i8 %start, 3
277  %f.3 = icmp uge i8 %start.3, %high
278  call void @use(i1 %f.3)
279
280  %start.4 = add i8 %start, 4
281  %c.4 = icmp uge i8 %start.4, %high
282  call void @use(i1 %c.4)
283
284  %start.5 = add i8 %start, 5
285  %c.5 = icmp uge i8 %start.5, %high
286  call void @use(i1 %c.5)
287
288  ret void
289}
290
291
292declare void @use(i1)
293