Skip to content

Commit 1ab5329

Browse files
committed
[InstCombine] Add pre-commit tests. NFC.
1 parent 3e64f8a commit 1ab5329

File tree

1 file changed

+304
-0
lines changed

1 file changed

+304
-0
lines changed
Lines changed: 304 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,304 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2+
; RUN: opt < %s -S -passes=instcombine | FileCheck %s
3+
4+
declare void @use64(i64)
5+
declare void @useptr(ptr)
6+
7+
define ptr @test_zero(ptr %base, i64 %a) {
8+
; CHECK-LABEL: define ptr @test_zero(
9+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
10+
; CHECK-NEXT: entry:
11+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
12+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
13+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4
14+
; CHECK-NEXT: ret ptr [[P2]]
15+
;
16+
entry:
17+
%p1 = getelementptr i8, ptr %base, i64 -4
18+
%index = add i64 %a, 1
19+
%p2 = getelementptr i32, ptr %p1, i64 %index
20+
ret ptr %p2
21+
}
22+
23+
define ptr @test_nonzero(ptr %base, i64 %a) {
24+
; CHECK-LABEL: define ptr @test_nonzero(
25+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
26+
; CHECK-NEXT: entry:
27+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
28+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[TMP0]], i64 [[A]]
29+
; CHECK-NEXT: [[P3:%.*]] = getelementptr i8, ptr [[P2]], i64 8
30+
; CHECK-NEXT: ret ptr [[P3]]
31+
;
32+
entry:
33+
%p1 = getelementptr i8, ptr %base, i64 -4
34+
%index = add i64 %a, 2
35+
%p2 = getelementptr i32, ptr %p1, i64 %index
36+
ret ptr %p2
37+
}
38+
39+
define ptr @test_or_disjoint(ptr %base, i64 %a) {
40+
; CHECK-LABEL: define ptr @test_or_disjoint(
41+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
42+
; CHECK-NEXT: entry:
43+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
44+
; CHECK-NEXT: [[INDEX:%.*]] = or disjoint i64 [[A]], 1
45+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]
46+
; CHECK-NEXT: ret ptr [[P2]]
47+
;
48+
entry:
49+
%p1 = getelementptr i8, ptr %base, i64 -4
50+
%index = or disjoint i64 %a, 1
51+
%p2 = getelementptr i32, ptr %p1, i64 %index
52+
ret ptr %p2
53+
}
54+
55+
define ptr @test_zero_multiuse_index(ptr %base, i64 %a) {
56+
; CHECK-LABEL: define ptr @test_zero_multiuse_index(
57+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
58+
; CHECK-NEXT: entry:
59+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
60+
; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 1
61+
; CHECK-NEXT: call void @use64(i64 [[INDEX]])
62+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]
63+
; CHECK-NEXT: ret ptr [[P2]]
64+
;
65+
entry:
66+
%p1 = getelementptr i8, ptr %base, i64 -4
67+
%index = add i64 %a, 1
68+
call void @use64(i64 %index)
69+
%p2 = getelementptr i32, ptr %p1, i64 %index
70+
ret ptr %p2
71+
}
72+
73+
define ptr @test_zero_multiuse_ptr(ptr %base, i64 %a) {
74+
; CHECK-LABEL: define ptr @test_zero_multiuse_ptr(
75+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
76+
; CHECK-NEXT: entry:
77+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
78+
; CHECK-NEXT: call void @useptr(ptr [[P1]])
79+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
80+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4
81+
; CHECK-NEXT: ret ptr [[P2]]
82+
;
83+
entry:
84+
%p1 = getelementptr i8, ptr %base, i64 -4
85+
call void @useptr(ptr %p1)
86+
%index = add i64 %a, 1
87+
%p2 = getelementptr i32, ptr %p1, i64 %index
88+
ret ptr %p2
89+
}
90+
91+
define ptr @test_zero_sext_add_nsw(ptr %base, i32 %a) {
92+
; CHECK-LABEL: define ptr @test_zero_sext_add_nsw(
93+
; CHECK-SAME: ptr [[BASE:%.*]], i32 [[A:%.*]]) {
94+
; CHECK-NEXT: entry:
95+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
96+
; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[A]] to i64
97+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[P1]], i64 [[TMP0]]
98+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 4
99+
; CHECK-NEXT: ret ptr [[P2]]
100+
;
101+
entry:
102+
%p1 = getelementptr i8, ptr %base, i64 -4
103+
%index = add nsw i32 %a, 1
104+
%p2 = getelementptr i32, ptr %p1, i32 %index
105+
ret ptr %p2
106+
}
107+
108+
define ptr @test_zero_trunc_add(ptr %base, i128 %a) {
109+
; CHECK-LABEL: define ptr @test_zero_trunc_add(
110+
; CHECK-SAME: ptr [[BASE:%.*]], i128 [[A:%.*]]) {
111+
; CHECK-NEXT: entry:
112+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
113+
; CHECK-NEXT: [[TMP0:%.*]] = trunc i128 [[A]] to i64
114+
; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i32, ptr [[P1]], i64 [[TMP0]]
115+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP1]], i64 4
116+
; CHECK-NEXT: ret ptr [[P2]]
117+
;
118+
entry:
119+
%p1 = getelementptr i8, ptr %base, i64 -4
120+
%index = add i128 %a, 1
121+
%p2 = getelementptr i32, ptr %p1, i128 %index
122+
ret ptr %p2
123+
}
124+
125+
define ptr @test_non_i8(ptr %base, i64 %a) {
126+
; CHECK-LABEL: define ptr @test_non_i8(
127+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
128+
; CHECK-NEXT: entry:
129+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -8
130+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
131+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4
132+
; CHECK-NEXT: ret ptr [[P2]]
133+
;
134+
entry:
135+
%p1 = getelementptr i16, ptr %base, i64 -4
136+
%index = add i64 %a, 1
137+
%p2 = getelementptr i32, ptr %p1, i64 %index
138+
ret ptr %p2
139+
}
140+
141+
define ptr @test_non_const(ptr %base, i64 %a, i64 %b) {
142+
; CHECK-LABEL: define ptr @test_non_const(
143+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
144+
; CHECK-NEXT: entry:
145+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[B]]
146+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
147+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4
148+
; CHECK-NEXT: ret ptr [[P2]]
149+
;
150+
entry:
151+
%p1 = getelementptr i8, ptr %base, i64 %b
152+
%index = add i64 %a, 1
153+
%p2 = getelementptr i32, ptr %p1, i64 %index
154+
ret ptr %p2
155+
}
156+
157+
define ptr @test_too_many_indices(ptr %base, i64 %a, i64 %b) {
158+
; CHECK-LABEL: define ptr @test_too_many_indices(
159+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]], i64 [[B:%.*]]) {
160+
; CHECK-NEXT: entry:
161+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[B]]
162+
; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 1
163+
; CHECK-NEXT: [[P2:%.*]] = getelementptr [8 x i32], ptr [[P1]], i64 1, i64 [[INDEX]]
164+
; CHECK-NEXT: ret ptr [[P2]]
165+
;
166+
entry:
167+
%p1 = getelementptr i8, ptr %base, i64 %b
168+
%index = add i64 %a, 1
169+
%p2 = getelementptr [8 x i32], ptr %p1, i64 1, i64 %index
170+
ret ptr %p2
171+
}
172+
173+
define ptr @test_wrong_op(ptr %base, i64 %a) {
174+
; CHECK-LABEL: define ptr @test_wrong_op(
175+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
176+
; CHECK-NEXT: entry:
177+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
178+
; CHECK-NEXT: [[INDEX:%.*]] = xor i64 [[A]], 1
179+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]
180+
; CHECK-NEXT: ret ptr [[P2]]
181+
;
182+
entry:
183+
%p1 = getelementptr i8, ptr %base, i64 -4
184+
%index = xor i64 %a, 1
185+
%p2 = getelementptr i32, ptr %p1, i64 %index
186+
ret ptr %p2
187+
}
188+
189+
define ptr @test_sext_add_without_nsw(ptr %base, i32 %a) {
190+
; CHECK-LABEL: define ptr @test_sext_add_without_nsw(
191+
; CHECK-SAME: ptr [[BASE:%.*]], i32 [[A:%.*]]) {
192+
; CHECK-NEXT: entry:
193+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
194+
; CHECK-NEXT: [[INDEX:%.*]] = add i32 [[A]], 1
195+
; CHECK-NEXT: [[TMP0:%.*]] = sext i32 [[INDEX]] to i64
196+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[TMP0]]
197+
; CHECK-NEXT: ret ptr [[P2]]
198+
;
199+
entry:
200+
%p1 = getelementptr i8, ptr %base, i64 -4
201+
%index = add i32 %a, 1
202+
%p2 = getelementptr i32, ptr %p1, i32 %index
203+
ret ptr %p2
204+
}
205+
206+
define ptr @test_or_without_disjoint(ptr %base, i64 %a) {
207+
; CHECK-LABEL: define ptr @test_or_without_disjoint(
208+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
209+
; CHECK-NEXT: entry:
210+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
211+
; CHECK-NEXT: [[INDEX:%.*]] = or i64 [[A]], 1
212+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]
213+
; CHECK-NEXT: ret ptr [[P2]]
214+
;
215+
entry:
216+
%p1 = getelementptr i8, ptr %base, i64 -4
217+
%index = or i64 %a, 1
218+
%p2 = getelementptr i32, ptr %p1, i64 %index
219+
ret ptr %p2
220+
}
221+
222+
define ptr @test_smul_overflow(ptr %base, i64 %a) {
223+
; CHECK-LABEL: define ptr @test_smul_overflow(
224+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
225+
; CHECK-NEXT: entry:
226+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
227+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
228+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 -8
229+
; CHECK-NEXT: ret ptr [[P2]]
230+
;
231+
entry:
232+
%p1 = getelementptr i8, ptr %base, i64 -4
233+
%index = add i64 %a, 9223372036854775806
234+
%p2 = getelementptr i32, ptr %p1, i64 %index
235+
ret ptr %p2
236+
}
237+
238+
define ptr @test_sadd_overflow(ptr %base, i64 %a) {
239+
; CHECK-LABEL: define ptr @test_sadd_overflow(
240+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
241+
; CHECK-NEXT: entry:
242+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 9223372036854775804
243+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
244+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 4
245+
; CHECK-NEXT: ret ptr [[P2]]
246+
;
247+
entry:
248+
%p1 = getelementptr i8, ptr %base, i64 9223372036854775804
249+
%index = add i64 %a, 1
250+
%p2 = getelementptr i32, ptr %p1, i64 %index
251+
ret ptr %p2
252+
}
253+
254+
define ptr @test_nonzero_multiuse_index(ptr %base, i64 %a) {
255+
; CHECK-LABEL: define ptr @test_nonzero_multiuse_index(
256+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
257+
; CHECK-NEXT: entry:
258+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
259+
; CHECK-NEXT: [[INDEX:%.*]] = add i64 [[A]], 2
260+
; CHECK-NEXT: call void @use64(i64 [[INDEX]])
261+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i32, ptr [[P1]], i64 [[INDEX]]
262+
; CHECK-NEXT: ret ptr [[P2]]
263+
;
264+
entry:
265+
%p1 = getelementptr i8, ptr %base, i64 -4
266+
%index = add i64 %a, 2
267+
call void @use64(i64 %index)
268+
%p2 = getelementptr i32, ptr %p1, i64 %index
269+
ret ptr %p2
270+
}
271+
272+
define ptr @test_nonzero_multiuse_ptr(ptr %base, i64 %a) {
273+
; CHECK-LABEL: define ptr @test_nonzero_multiuse_ptr(
274+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
275+
; CHECK-NEXT: entry:
276+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
277+
; CHECK-NEXT: call void @useptr(ptr [[P1]])
278+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i32, ptr [[P1]], i64 [[A]]
279+
; CHECK-NEXT: [[P2:%.*]] = getelementptr i8, ptr [[TMP0]], i64 8
280+
; CHECK-NEXT: ret ptr [[P2]]
281+
;
282+
entry:
283+
%p1 = getelementptr i8, ptr %base, i64 -4
284+
call void @useptr(ptr %p1)
285+
%index = add i64 %a, 2
286+
%p2 = getelementptr i32, ptr %p1, i64 %index
287+
ret ptr %p2
288+
}
289+
290+
define ptr @test_scalable(ptr %base, i64 %a) {
291+
; CHECK-LABEL: define ptr @test_scalable(
292+
; CHECK-SAME: ptr [[BASE:%.*]], i64 [[A:%.*]]) {
293+
; CHECK-NEXT: entry:
294+
; CHECK-NEXT: [[P1:%.*]] = getelementptr i8, ptr [[BASE]], i64 -4
295+
; CHECK-NEXT: [[TMP0:%.*]] = getelementptr <vscale x 4 x i32>, ptr [[P1]], i64 [[A]]
296+
; CHECK-NEXT: [[P2:%.*]] = getelementptr <vscale x 4 x i32>, ptr [[TMP0]], i64 1
297+
; CHECK-NEXT: ret ptr [[P2]]
298+
;
299+
entry:
300+
%p1 = getelementptr i8, ptr %base, i64 -4
301+
%index = add i64 %a, 1
302+
%p2 = getelementptr <vscale x 4 x i32>, ptr %p1, i64 %index
303+
ret ptr %p2
304+
}

0 commit comments

Comments
 (0)