xref: /llvm-project/llvm/test/Transforms/InstCombine/strlen-5.ll (revision 4ab40eca080965c65802710e39adbb78c4ce7bde)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; Verify that strlen calls with elements of constant arrays are folded.
3;
4; RUN: opt < %s -passes=instcombine -S | FileCheck %s
5
6declare i64 @strlen(ptr)
7
8@a5_4 = constant [5 x [4 x i8]] [[4 x i8] c"123\00", [4 x i8] c"12\00\00", [4 x i8] c"1\00\00\00", [4 x i8] zeroinitializer, [4 x i8] zeroinitializer]
9
10
11; Fold strlen(a5_4[0]) to 3.
12
13define i64 @fold_a5_4_i0_to_3() {
14; CHECK-LABEL: @fold_a5_4_i0_to_3(
15; CHECK-NEXT:    ret i64 3
16;
17  %len = call i64 @strlen(ptr @a5_4)
18  ret i64 %len
19}
20
21
22; Fold strlen(&a5_4[0][1]) to 2.
23
24define i64 @fold_a5_4_i0_p1_to_2() {
25; CHECK-LABEL: @fold_a5_4_i0_p1_to_2(
26; CHECK-NEXT:    ret i64 2
27;
28  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 1
29  %len = call i64 @strlen(ptr %ptr)
30  ret i64 %len
31}
32
33
34; Fold strlen(&a5_4[0][2]) to 1.
35
36define i64 @fold_a5_4_i0_p2_to_1() {
37; CHECK-LABEL: @fold_a5_4_i0_p2_to_1(
38; CHECK-NEXT:    ret i64 1
39;
40  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 2
41  %len = call i64 @strlen(ptr %ptr)
42  ret i64 %len
43}
44
45
46; Fold strlen(&a5_4[0][3]) to 0.
47
48define i64 @fold_a5_4_i0_p3_to_0() {
49; CHECK-LABEL: @fold_a5_4_i0_p3_to_0(
50; CHECK-NEXT:    ret i64 0
51;
52  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 3
53  %len = call i64 @strlen(ptr %ptr)
54  ret i64 %len
55}
56
57
58; Fold strlen(a5_4[1]) to 2.
59
60define i64 @fold_a5_4_i1_to_2() {
61; CHECK-LABEL: @fold_a5_4_i1_to_2(
62; CHECK-NEXT:    ret i64 2
63;
64  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 0
65  %len = call i64 @strlen(ptr %ptr)
66  ret i64 %len
67}
68
69
70; Fold strlen(&a5_4[1][1]) to 1.
71
72define i64 @fold_a5_4_i1_p1_to_1() {
73; CHECK-LABEL: @fold_a5_4_i1_p1_to_1(
74; CHECK-NEXT:    ret i64 1
75;
76  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 1
77  %len = call i64 @strlen(ptr %ptr)
78  ret i64 %len
79}
80
81
82; Fold strlen(&a5_4[1][2]) to 0.
83
84define i64 @fold_a5_4_i1_p2_to_0() {
85; CHECK-LABEL: @fold_a5_4_i1_p2_to_0(
86; CHECK-NEXT:    ret i64 0
87;
88  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 2
89  %len = call i64 @strlen(ptr %ptr)
90  ret i64 %len
91}
92
93
94; Fold strlen(&a5_4[1][3]) to 0.
95
96define i64 @fold_a5_4_i1_p3_to_0() {
97; CHECK-LABEL: @fold_a5_4_i1_p3_to_0(
98; CHECK-NEXT:    ret i64 0
99;
100  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 3
101  %len = call i64 @strlen(ptr %ptr)
102  ret i64 %len
103}
104
105
106; Fold strlen(a5_4[2]) to 1.
107
108define i64 @fold_a5_4_i2_to_1() {
109; CHECK-LABEL: @fold_a5_4_i2_to_1(
110; CHECK-NEXT:    ret i64 1
111;
112  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 0
113  %len = call i64 @strlen(ptr %ptr)
114  ret i64 %len
115}
116
117
118; Fold strlen(&a5_4[2][1]) to 0.
119
120define i64 @fold_a5_4_i2_p1_to_0() {
121; CHECK-LABEL: @fold_a5_4_i2_p1_to_0(
122; CHECK-NEXT:    ret i64 0
123;
124  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 1
125  %len = call i64 @strlen(ptr %ptr)
126  ret i64 %len
127}
128
129
130; Fold strlen(&a5_4[2][2]) to 0.
131
132define i64 @fold_a5_4_i2_p2_to_0() {
133; CHECK-LABEL: @fold_a5_4_i2_p2_to_0(
134; CHECK-NEXT:    ret i64 0
135;
136  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 2
137  %len = call i64 @strlen(ptr %ptr)
138  ret i64 %len
139}
140
141
142; Fold strlen(&a5_4[2][3]) to 0.
143
144define i64 @fold_a5_4_i2_p3_to_0() {
145; CHECK-LABEL: @fold_a5_4_i2_p3_to_0(
146; CHECK-NEXT:    ret i64 0
147;
148  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 3
149  %len = call i64 @strlen(ptr %ptr)
150  ret i64 %len
151}
152
153
154; Fold strlen(a5_4[3]) to 0
155
156define i64 @fold_a5_4_i3_to_0() {
157; CHECK-LABEL: @fold_a5_4_i3_to_0(
158; CHECK-NEXT:    ret i64 0
159;
160  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 0
161  %len = call i64 @strlen(ptr %ptr)
162  ret i64 %len
163}
164
165
166; Fold strlen(&a5_4[3][1]) to 0
167
168define i64 @fold_a5_4_i3_p1_to_0() {
169; CHECK-LABEL: @fold_a5_4_i3_p1_to_0(
170; CHECK-NEXT:    ret i64 0
171;
172  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 1
173  %len = call i64 @strlen(ptr %ptr)
174  ret i64 %len
175}
176
177
178; Fold strlen(&a5_4[3][2]) to 0
179
180define i64 @fold_a5_4_i3_p2_to_0() {
181; CHECK-LABEL: @fold_a5_4_i3_p2_to_0(
182; CHECK-NEXT:    ret i64 0
183;
184  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 2
185  %len = call i64 @strlen(ptr %ptr)
186  ret i64 %len
187}
188
189
190; Fold strlen(&a5_4[3][3]) to 0
191
192define i64 @fold_a5_3_i4_p3_to_0() {
193; CHECK-LABEL: @fold_a5_3_i4_p3_to_0(
194; CHECK-NEXT:    ret i64 0
195;
196  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 3
197  %len = call i64 @strlen(ptr %ptr)
198  ret i64 %len
199}
200
201
202; Fold strlen(a5_4[4]) to 0
203
204define i64 @fold_a5_4_i4_to_0() {
205; CHECK-LABEL: @fold_a5_4_i4_to_0(
206; CHECK-NEXT:    ret i64 0
207;
208  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 0
209  %len = call i64 @strlen(ptr %ptr)
210  ret i64 %len
211}
212
213
214; Fold strlen(&a5_4[4][1]) to 0
215
216define i64 @fold_a5_4_i4_p1_to_0() {
217; CHECK-LABEL: @fold_a5_4_i4_p1_to_0(
218; CHECK-NEXT:    ret i64 0
219;
220  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 1
221  %len = call i64 @strlen(ptr %ptr)
222  ret i64 %len
223}
224
225
226; Fold strlen(&a5_4[4][2]) to 0
227
228define i64 @fold_a5_4_i4_p2_to_0() {
229; CHECK-LABEL: @fold_a5_4_i4_p2_to_0(
230; CHECK-NEXT:    ret i64 0
231;
232  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 2
233  %len = call i64 @strlen(ptr %ptr)
234  ret i64 %len
235}
236
237
238; Fold strlen(&a5_4[4][3]) to 0
239
240define i64 @fold_a5_4_i4_p3_to_0() {
241; CHECK-LABEL: @fold_a5_4_i4_p3_to_0(
242; CHECK-NEXT:    ret i64 0
243;
244  %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 3
245  %len = call i64 @strlen(ptr %ptr)
246  ret i64 %len
247}
248