xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/memchr.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; Test that the memchr library call simplifier works correctly.
3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128-n8:16:32"
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker@hello = constant [14 x i8] c"hello world\5Cn\00"
8*9880d681SAndroid Build Coastguard Worker@hellonull = constant [14 x i8] c"hello\00world\5Cn\00"
9*9880d681SAndroid Build Coastguard Worker@null = constant [1 x i8] zeroinitializer
10*9880d681SAndroid Build Coastguard Worker@newlines = constant [3 x i8] c"\0D\0A\00"
11*9880d681SAndroid Build Coastguard Worker@single = constant [2 x i8] c"\1F\00"
12*9880d681SAndroid Build Coastguard Worker@spaces = constant [4 x i8] c" \0D\0A\00"
13*9880d681SAndroid Build Coastguard Worker@negative = constant [3 x i8] c"\FF\FE\00"
14*9880d681SAndroid Build Coastguard Worker@chp = global i8* zeroinitializer
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdeclare i8* @memchr(i8*, i32, i32)
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerdefine void @test1() {
19*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
20*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 6), i8** @chp, align 4
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
22*9880d681SAndroid Build Coastguard Worker;
23*9880d681SAndroid Build Coastguard Worker  %str = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
24*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %str, i32 119, i32 14)
25*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine void @test2() {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* null, i8** @chp, align 4
32*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
33*9880d681SAndroid Build Coastguard Worker;
34*9880d681SAndroid Build Coastguard Worker  %str = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0
35*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %str, i32 119, i32 1)
36*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
37*9880d681SAndroid Build Coastguard Worker  ret void
38*9880d681SAndroid Build Coastguard Worker}
39*9880d681SAndroid Build Coastguard Worker
40*9880d681SAndroid Build Coastguard Workerdefine void @test3() {
41*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 13), i8** @chp, align 4
43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
44*9880d681SAndroid Build Coastguard Worker;
45*9880d681SAndroid Build Coastguard Worker  %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
46*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %src, i32 0, i32 14)
47*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
48*9880d681SAndroid Build Coastguard Worker  ret void
49*9880d681SAndroid Build Coastguard Worker}
50*9880d681SAndroid Build Coastguard Worker
51*9880d681SAndroid Build Coastguard Workerdefine void @test4(i32 %chr) {
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DST:%.*]] = call i8* @memchr(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 0), i32 %chr, i32 14)
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* [[DST]], i8** @chp, align 4
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
56*9880d681SAndroid Build Coastguard Worker;
57*9880d681SAndroid Build Coastguard Worker  %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
58*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %src, i32 %chr, i32 14)
59*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
60*9880d681SAndroid Build Coastguard Worker  ret void
61*9880d681SAndroid Build Coastguard Worker}
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Workerdefine void @test5() {
64*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
65*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 13), i8** @chp, align 4
66*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
67*9880d681SAndroid Build Coastguard Worker;
68*9880d681SAndroid Build Coastguard Worker  %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
69*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %src, i32 65280, i32 14)
70*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
71*9880d681SAndroid Build Coastguard Worker  ret void
72*9880d681SAndroid Build Coastguard Worker}
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine void @test6() {
75*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hello, i32 0, i32 6), i8** @chp, align 4
77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
78*9880d681SAndroid Build Coastguard Worker;
79*9880d681SAndroid Build Coastguard Worker  %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
80*9880d681SAndroid Build Coastguard Worker; Overflow, but we still find the right thing.
81*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %src, i32 119, i32 100)
82*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
83*9880d681SAndroid Build Coastguard Worker  ret void
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Workerdefine void @test7() {
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
88*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* null, i8** @chp, align 4
89*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
90*9880d681SAndroid Build Coastguard Worker;
91*9880d681SAndroid Build Coastguard Worker  %src = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
92*9880d681SAndroid Build Coastguard Worker; Overflow
93*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %src, i32 120, i32 100)
94*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
95*9880d681SAndroid Build Coastguard Worker  ret void
96*9880d681SAndroid Build Coastguard Worker}
97*9880d681SAndroid Build Coastguard Worker
98*9880d681SAndroid Build Coastguard Workerdefine void @test8() {
99*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
100*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hellonull, i32 0, i32 6), i8** @chp, align 4
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
102*9880d681SAndroid Build Coastguard Worker;
103*9880d681SAndroid Build Coastguard Worker  %str = getelementptr [14 x i8], [14 x i8]* @hellonull, i32 0, i32 0
104*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %str, i32 119, i32 14)
105*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
106*9880d681SAndroid Build Coastguard Worker  ret void
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine void @test9() {
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* getelementptr inbounds ([14 x i8], [14 x i8]* @hellonull, i32 0, i32 6), i8** @chp, align 4
112*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
113*9880d681SAndroid Build Coastguard Worker;
114*9880d681SAndroid Build Coastguard Worker  %str = getelementptr [14 x i8], [14 x i8]* @hellonull, i32 0, i32 2
115*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %str, i32 119, i32 12)
116*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
117*9880d681SAndroid Build Coastguard Worker  ret void
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine void @test10() {
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    store i8* null, i8** @chp, align 4
123*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret void
124*9880d681SAndroid Build Coastguard Worker;
125*9880d681SAndroid Build Coastguard Worker  %str = getelementptr [14 x i8], [14 x i8]* @hello, i32 0, i32 0
126*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* %str, i32 119, i32 6)
127*9880d681SAndroid Build Coastguard Worker  store i8* %dst, i8** @chp
128*9880d681SAndroid Build Coastguard Worker  ret void
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; Check transformation memchr("\r\n", C, 2) != nullptr -> (C & 9216) != 0
132*9880d681SAndroid Build Coastguard Workerdefine i1 @test11(i32 %C) {
133*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
134*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = trunc i32 %C to i16
135*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MEMCHR_BOUNDS:%.*]] = icmp ult i16 [[TMP1]], 16
136*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = shl i16 1, [[TMP1]]
137*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP3:%.*]] = and i16 [[TMP2]], 9216
138*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MEMCHR_BITS:%.*]] = icmp ne i16 [[TMP3]], 0
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MEMCHR:%.*]] = and i1 [[MEMCHR:%.*]].bounds, [[MEMCHR:%.*]].bits
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[MEMCHR]]
141*9880d681SAndroid Build Coastguard Worker;
142*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @newlines, i64 0, i64 0), i32 %C, i32 2)
143*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8* %dst, null
144*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; No 64 bits here
148*9880d681SAndroid Build Coastguard Workerdefine i1 @test12(i32 %C) {
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DST:%.*]] = call i8* @memchr(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @spaces, i32 0, i32 0), i32 %C, i32 3)
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8* [[DST]], null
152*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
153*9880d681SAndroid Build Coastguard Worker;
154*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* getelementptr inbounds ([4 x i8], [4 x i8]* @spaces, i64 0, i64 0), i32 %C, i32 3)
155*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8* %dst, null
156*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Workerdefine i1 @test13(i32 %C) {
160*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MEMCHR_BOUNDS:%.*]] = icmp ult i32 %C, 32
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = shl i32 1, %C
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP2:%.*]] = and i32 [[TMP1]], -2147483647
164*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MEMCHR_BITS:%.*]] = icmp ne i32 [[TMP2]], 0
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[MEMCHR:%.*]] = and i1 [[MEMCHR:%.*]].bounds, [[MEMCHR:%.*]].bits
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[MEMCHR]]
167*9880d681SAndroid Build Coastguard Worker;
168*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @single, i64 0, i64 0), i32 %C, i32 2)
169*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8* %dst, null
170*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdefine i1 @test14(i32 %C) {
174*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 %C, 31
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[TMP1]]
177*9880d681SAndroid Build Coastguard Worker;
178*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* getelementptr inbounds ([2 x i8], [2 x i8]* @single, i64 0, i64 0), i32 %C, i32 1)
179*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8* %dst, null
180*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
181*9880d681SAndroid Build Coastguard Worker}
182*9880d681SAndroid Build Coastguard Worker
183*9880d681SAndroid Build Coastguard Workerdefine i1 @test15(i32 %C) {
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
185*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[DST:%.*]] = call i8* @memchr(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @negative, i32 0, i32 0), i32 %C, i32 3)
186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[CMP:%.*]] = icmp ne i8* [[DST]], null
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 [[CMP]]
188*9880d681SAndroid Build Coastguard Worker;
189*9880d681SAndroid Build Coastguard Worker  %dst = call i8* @memchr(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @negative, i64 0, i64 0), i32 %C, i32 3)
190*9880d681SAndroid Build Coastguard Worker  %cmp = icmp ne i8* %dst, null
191*9880d681SAndroid Build Coastguard Worker  ret i1 %cmp
192*9880d681SAndroid Build Coastguard Worker}
193