Skip to content

Commit deadda7

Browse files
author
Martin Sebor
committed
[InstCombine] Add more memrchr tests (NFC).
1 parent d49ce7c commit deadda7

File tree

3 files changed

+407
-0
lines changed

3 files changed

+407
-0
lines changed
Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
;
4+
; Verify that memrchr calls with an out of bounds size are folded to null.
5+
6+
declare i8* @memrchr(i8*, i32, i64)
7+
8+
@ax = external global [0 x i8]
9+
@ax1 = external global [1 x i8]
10+
@a12345 = constant [5 x i8] c"\01\02\03\04\05"
11+
12+
13+
; Fold memrchr(a12345, 1, UINT32_MAX + 1LU) to null (and not to a12345
14+
; as might happen if the size were to be truncated to int32_t).
15+
16+
define i8* @fold_memrchr_a12345_1_ui32max_p1(i32 %0) {
17+
; CHECK-LABEL: @fold_memrchr_a12345_1_ui32max_p1(
18+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 [[TMP0:%.*]], i64 4294967296)
19+
; CHECK-NEXT: ret i8* [[RET]]
20+
;
21+
; CHECK : ret i8* null
22+
23+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i64 0, i64 0
24+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 4294967296)
25+
ret i8* %ret
26+
}
27+
28+
29+
; Fold memrchr(ax1, 1, UINT32_MAX + 2LU) to null (and not to *ax1 == 1).
30+
31+
define i8* @fold_memrchr_ax1_1_ui32max_p2(i32 %0) {
32+
; CHECK-LABEL: @fold_memrchr_ax1_1_ui32max_p2(
33+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([1 x i8], [1 x i8]* @ax1, i64 0, i64 0), i32 [[TMP0:%.*]], i64 4294967297)
34+
; CHECK-NEXT: ret i8* [[RET]]
35+
;
36+
; CHECK : ret i8* null
37+
38+
%ptr = getelementptr [1 x i8], [1 x i8]* @ax1, i64 0, i64 0
39+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 4294967297)
40+
ret i8* %ret
41+
}
42+
43+
44+
; But don't fold memrchr(ax, 1, UINT32_MAX + 2LU) to *ax == 1.
45+
46+
define i8* @fold_memrchr_ax_1_ui32max_p2(i32 %0) {
47+
; CHECK-LABEL: @fold_memrchr_ax_1_ui32max_p2(
48+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 [[TMP0:%.*]], i64 4294967297)
49+
; CHECK-NEXT: ret i8* [[RET]]
50+
;
51+
52+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i64 0, i64 0
53+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 4294967297)
54+
ret i8* %ret
55+
}
56+
57+
58+
; Fold memrchr(a12345, c, 6) to null.
59+
60+
define i8* @fold_memrchr_a12345_c_6(i32 %0) {
61+
; CHECK-LABEL: @fold_memrchr_a12345_c_6(
62+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 [[TMP0:%.*]], i64 6)
63+
; CHECK-NEXT: ret i8* [[RET]]
64+
;
65+
; CHECK : ret i8* null
66+
67+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i64 0, i64 0
68+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 6)
69+
ret i8* %ret
70+
}
71+
72+
73+
; Fold memrchr(a12345, c, SIZE_MAX) to null.
74+
75+
define i8* @fold_memrchr_a12345_c_szmax(i32 %0) {
76+
; CHECK-LABEL: @fold_memrchr_a12345_c_szmax(
77+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 [[TMP0:%.*]], i64 -1)
78+
; CHECK-NEXT: ret i8* [[RET]]
79+
;
80+
; CHECK : ret i8* null
81+
82+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i64 0, i64 0
83+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 18446744073709551615)
84+
ret i8* %ret
85+
}
Lines changed: 256 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,256 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2+
; RUN: opt < %s -passes=instcombine -S | FileCheck %s
3+
;
4+
; Verify that memrchr calls with one or more constant arguments are folded
5+
; as expected.
6+
7+
declare i8* @memrchr(i8*, i32, i64)
8+
9+
@ax = external global [0 x i8]
10+
@a12345 = constant [5 x i8] c"\01\02\03\04\05"
11+
@a123123 = constant [6 x i8] c"\01\02\03\01\02\03"
12+
13+
14+
; Fold memrchr(ax, c, 0) to null.
15+
16+
define i8* @fold_memrchr_ax_c_0(i32 %0) {
17+
; CHECK-LABEL: @fold_memrchr_ax_c_0(
18+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* getelementptr inbounds ([0 x i8], [0 x i8]* @ax, i64 0, i64 0), i32 [[TMP0:%.*]], i64 0)
19+
; CHECK-NEXT: ret i8* [[RET]]
20+
;
21+
22+
%ptr = getelementptr [0 x i8], [0 x i8]* @ax, i32 0, i32 0
23+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 0)
24+
ret i8* %ret
25+
}
26+
27+
28+
; Fold memrchr(a12345, 3, 0) to null.
29+
30+
define i8* @fold_memrchr_a12345_3_0() {
31+
; CHECK-LABEL: @fold_memrchr_a12345_3_0(
32+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 3, i64 0)
33+
; CHECK-NEXT: ret i8* [[RET]]
34+
;
35+
36+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
37+
%ret = call i8* @memrchr(i8* %ptr, i32 3, i64 0)
38+
ret i8* %ret
39+
}
40+
41+
42+
; Fold memrchr(a12345, 1, 1) to a12345.
43+
44+
define i8* @fold_memrchr_a12345_1_1() {
45+
; CHECK-LABEL: @fold_memrchr_a12345_1_1(
46+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 1, i64 1)
47+
; CHECK-NEXT: ret i8* [[RET]]
48+
;
49+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
50+
%ret = call i8* @memrchr(i8* %ptr, i32 1, i64 1)
51+
ret i8* %ret
52+
}
53+
54+
55+
; Fold memrchr(a12345, 5, 1) to null.
56+
57+
define i8* @fold_memrchr_a12345_5_1() {
58+
; CHECK-LABEL: @fold_memrchr_a12345_5_1(
59+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 5, i64 1)
60+
; CHECK-NEXT: ret i8* [[RET]]
61+
;
62+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
63+
%ret = call i8* @memrchr(i8* %ptr, i32 5, i64 1)
64+
ret i8* %ret
65+
}
66+
67+
68+
; Fold memrchr(a123123, 1, 1) to a123123.
69+
70+
define i8* @fold_memrchr_a123123_1_1() {
71+
; CHECK-LABEL: @fold_memrchr_a123123_1_1(
72+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 1, i64 1)
73+
; CHECK-NEXT: ret i8* [[RET]]
74+
;
75+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
76+
%ret = call i8* @memrchr(i8* %ptr, i32 1, i64 1)
77+
ret i8* %ret
78+
}
79+
80+
81+
; Fold memrchr(a123123, 3, 1) to null.
82+
83+
define i8* @fold_memrchr_a123123_3_1() {
84+
; CHECK-LABEL: @fold_memrchr_a123123_3_1(
85+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 3, i64 1)
86+
; CHECK-NEXT: ret i8* [[RET]]
87+
;
88+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
89+
%ret = call i8* @memrchr(i8* %ptr, i32 3, i64 1)
90+
ret i8* %ret
91+
}
92+
93+
94+
; Fold memrchr(ax, c, 1) to *ax == c ? ax : null.
95+
96+
define i8* @fold_memrchr_ax_c_1(i32 %0) {
97+
; CHECK-LABEL: @fold_memrchr_ax_c_1(
98+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([0 x i8], [0 x i8]* @ax, i64 0, i64 0), i32 [[TMP0:%.*]], i64 1)
99+
; CHECK-NEXT: ret i8* [[RET]]
100+
;
101+
%ptr = getelementptr [0 x i8], [0 x i8]* @ax, i32 0, i32 0
102+
%ret = call i8* @memrchr(i8* %ptr, i32 %0, i64 1)
103+
ret i8* %ret
104+
}
105+
106+
107+
; Fold memrchr(a12345, 5, 5) to a12345 + 4.
108+
109+
define i8* @fold_memrchr_a12345_5_5() {
110+
; CHECK-LABEL: @fold_memrchr_a12345_5_5(
111+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 5, i64 5)
112+
; CHECK-NEXT: ret i8* [[RET]]
113+
;
114+
115+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
116+
%ret = call i8* @memrchr(i8* %ptr, i32 5, i64 5)
117+
ret i8* %ret
118+
}
119+
120+
121+
; Fold memrchr(a12345, 5, 4) to null.
122+
123+
define i8* @fold_memrchr_a12345_5_4() {
124+
; CHECK-LABEL: @fold_memrchr_a12345_5_4(
125+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 5, i64 4)
126+
; CHECK-NEXT: ret i8* [[RET]]
127+
;
128+
129+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
130+
%ret = call i8* @memrchr(i8* %ptr, i32 5, i64 4)
131+
ret i8* %ret
132+
}
133+
134+
135+
; Fold memrchr(a12345, 4, 5) to a12345 + 3.
136+
137+
define i8* @fold_memrchr_a12345_4_5() {
138+
; CHECK-LABEL: @fold_memrchr_a12345_4_5(
139+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 4, i64 5)
140+
; CHECK-NEXT: ret i8* [[RET]]
141+
;
142+
143+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
144+
%ret = call i8* @memrchr(i8* %ptr, i32 4, i64 5)
145+
ret i8* %ret
146+
}
147+
148+
149+
; Fold memrchr(a12345 + 1, 1, 4) to null.
150+
151+
define i8* @fold_memrchr_a12345p1_1_4() {
152+
; CHECK-LABEL: @fold_memrchr_a12345p1_1_4(
153+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 1), i32 5, i64 4)
154+
; CHECK-NEXT: ret i8* [[RET]]
155+
;
156+
157+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 1
158+
%ret = call i8* @memrchr(i8* %ptr, i32 5, i64 4)
159+
ret i8* %ret
160+
}
161+
162+
163+
; Fold memrchr(a12345, 2, 5) to a12345 + 1.
164+
165+
define i8* @fold_memrchr_a12345_2_5() {
166+
; CHECK-LABEL: @fold_memrchr_a12345_2_5(
167+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 2, i64 5)
168+
; CHECK-NEXT: ret i8* [[RET]]
169+
;
170+
171+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
172+
%ret = call i8* @memrchr(i8* %ptr, i32 2, i64 5)
173+
ret i8* %ret
174+
}
175+
176+
177+
; Fold memrchr(a12345, 0, %0) to null.
178+
179+
define i8* @fold_memrchr_a12345_0_n(i64 %0) {
180+
; CHECK-LABEL: @fold_memrchr_a12345_0_n(
181+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @a12345, i64 0, i64 0), i32 0, i64 [[TMP0:%.*]])
182+
; CHECK-NEXT: ret i8* [[RET]]
183+
;
184+
185+
%ptr = getelementptr [5 x i8], [5 x i8]* @a12345, i32 0, i32 0
186+
%ret = call i8* @memrchr(i8* %ptr, i32 0, i64 %0)
187+
ret i8* %ret
188+
}
189+
190+
191+
; Fold memrchr(a123123, 3, 5) to a123123 + 2.
192+
193+
define i8* @fold_memrchr_a123123_3_5() {
194+
; CHECK-LABEL: @fold_memrchr_a123123_3_5(
195+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 3, i64 5)
196+
; CHECK-NEXT: ret i8* [[RET]]
197+
;
198+
199+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
200+
%ret = call i8* @memrchr(i8* %ptr, i32 3, i64 5)
201+
ret i8* %ret
202+
}
203+
204+
205+
; Fold memrchr(a123123, 3, 6) to a123123 + 5.
206+
207+
define i8* @fold_memrchr_a123123_3_6() {
208+
; CHECK-LABEL: @fold_memrchr_a123123_3_6(
209+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 3, i64 6)
210+
; CHECK-NEXT: ret i8* [[RET]]
211+
;
212+
213+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
214+
%ret = call i8* @memrchr(i8* %ptr, i32 3, i64 6)
215+
ret i8* %ret
216+
}
217+
218+
; Fold memrchr(a123123, 2, 6) to a123123 + 4.
219+
220+
define i8* @fold_memrchr_a123123_2_6() {
221+
; CHECK-LABEL: @fold_memrchr_a123123_2_6(
222+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 2, i64 6)
223+
; CHECK-NEXT: ret i8* [[RET]]
224+
;
225+
226+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
227+
%ret = call i8* @memrchr(i8* %ptr, i32 2, i64 6)
228+
ret i8* %ret
229+
}
230+
231+
; Fold memrchr(a123123, 1, 6) to a123123 + 3.
232+
233+
define i8* @fold_memrchr_a123123_1_6() {
234+
; CHECK-LABEL: @fold_memrchr_a123123_1_6(
235+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 1, i64 6)
236+
; CHECK-NEXT: ret i8* [[RET]]
237+
;
238+
239+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
240+
%ret = call i8* @memrchr(i8* %ptr, i32 1, i64 6)
241+
ret i8* %ret
242+
}
243+
244+
245+
; Fold memrchr(a123123, 0, 6) to null.
246+
247+
define i8* @fold_memrchr_a123123_0_6() {
248+
; CHECK-LABEL: @fold_memrchr_a123123_0_6(
249+
; CHECK-NEXT: [[RET:%.*]] = call i8* @memrchr(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([6 x i8], [6 x i8]* @a123123, i64 0, i64 0), i32 0, i64 6)
250+
; CHECK-NEXT: ret i8* [[RET]]
251+
;
252+
253+
%ptr = getelementptr [6 x i8], [6 x i8]* @a123123, i32 0, i32 0
254+
%ret = call i8* @memrchr(i8* %ptr, i32 0, i64 6)
255+
ret i8* %ret
256+
}

0 commit comments

Comments
 (0)