Skip to content

Commit 63d47da

Browse files
committed
[InstCombine] Add pre-commit tests for PR68882. NFC.
1 parent 70b00b4 commit 63d47da

File tree

1 file changed

+293
-0
lines changed

1 file changed

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

0 commit comments

Comments
 (0)