xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/strlen-1.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 strlen library call simplifier works correctly.
3*9880d681SAndroid Build Coastguard Worker;
4*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
5*9880d681SAndroid Build Coastguard Worker
6*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"
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker@hello = constant [6 x i8] c"hello\00"
9*9880d681SAndroid Build Coastguard Worker@longer = constant [7 x i8] c"longer\00"
10*9880d681SAndroid Build Coastguard Worker@null = constant [1 x i8] zeroinitializer
11*9880d681SAndroid Build Coastguard Worker@null_hello = constant [7 x i8] c"\00hello\00"
12*9880d681SAndroid Build Coastguard Worker@nullstring = constant i8 0
13*9880d681SAndroid Build Coastguard Worker@a = common global [32 x i8] zeroinitializer, align 1
14*9880d681SAndroid Build Coastguard Worker@null_hello_mid = constant [13 x i8] c"hello wor\00ld\00"
15*9880d681SAndroid Build Coastguard Worker
16*9880d681SAndroid Build Coastguard Workerdeclare i32 @strlen(i8*)
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker; Check strlen(string constant) -> integer constant.
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify1() {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify1(
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 5
23*9880d681SAndroid Build Coastguard Worker;
24*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0
25*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
26*9880d681SAndroid Build Coastguard Worker  ret i32 %hello_l
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify2() {
30*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify2(
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
32*9880d681SAndroid Build Coastguard Worker;
33*9880d681SAndroid Build Coastguard Worker  %null_p = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0
34*9880d681SAndroid Build Coastguard Worker  %null_l = call i32 @strlen(i8* %null_p)
35*9880d681SAndroid Build Coastguard Worker  ret i32 %null_l
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify3() {
39*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify3(
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
41*9880d681SAndroid Build Coastguard Worker;
42*9880d681SAndroid Build Coastguard Worker  %null_hello_p = getelementptr [7 x i8], [7 x i8]* @null_hello, i32 0, i32 0
43*9880d681SAndroid Build Coastguard Worker  %null_hello_l = call i32 @strlen(i8* %null_hello_p)
44*9880d681SAndroid Build Coastguard Worker  ret i32 %null_hello_l
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify4() {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify4(
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 0
50*9880d681SAndroid Build Coastguard Worker;
51*9880d681SAndroid Build Coastguard Worker  %len = tail call i32 @strlen(i8* @nullstring) nounwind
52*9880d681SAndroid Build Coastguard Worker  ret i32 %len
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker; Check strlen(x) == 0 --> *x == 0.
56*9880d681SAndroid Build Coastguard Worker
57*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify5() {
58*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify5(
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
60*9880d681SAndroid Build Coastguard Worker;
61*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0
62*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
63*9880d681SAndroid Build Coastguard Worker  %eq_hello = icmp eq i32 %hello_l, 0
64*9880d681SAndroid Build Coastguard Worker  ret i1 %eq_hello
65*9880d681SAndroid Build Coastguard Worker}
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify6() {
68*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify6(
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
70*9880d681SAndroid Build Coastguard Worker;
71*9880d681SAndroid Build Coastguard Worker  %null_p = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0
72*9880d681SAndroid Build Coastguard Worker  %null_l = call i32 @strlen(i8* %null_p)
73*9880d681SAndroid Build Coastguard Worker  %eq_null = icmp eq i32 %null_l, 0
74*9880d681SAndroid Build Coastguard Worker  ret i1 %eq_null
75*9880d681SAndroid Build Coastguard Worker}
76*9880d681SAndroid Build Coastguard Worker
77*9880d681SAndroid Build Coastguard Worker; Check strlen(x) != 0 --> *x != 0.
78*9880d681SAndroid Build Coastguard Worker
79*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify7() {
80*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify7(
81*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 true
82*9880d681SAndroid Build Coastguard Worker;
83*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0
84*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
85*9880d681SAndroid Build Coastguard Worker  %ne_hello = icmp ne i32 %hello_l, 0
86*9880d681SAndroid Build Coastguard Worker  ret i1 %ne_hello
87*9880d681SAndroid Build Coastguard Worker}
88*9880d681SAndroid Build Coastguard Worker
89*9880d681SAndroid Build Coastguard Workerdefine i1 @test_simplify8() {
90*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify8(
91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i1 false
92*9880d681SAndroid Build Coastguard Worker;
93*9880d681SAndroid Build Coastguard Worker  %null_p = getelementptr [1 x i8], [1 x i8]* @null, i32 0, i32 0
94*9880d681SAndroid Build Coastguard Worker  %null_l = call i32 @strlen(i8* %null_p)
95*9880d681SAndroid Build Coastguard Worker  %ne_null = icmp ne i32 %null_l, 0
96*9880d681SAndroid Build Coastguard Worker  ret i1 %ne_null
97*9880d681SAndroid Build Coastguard Worker}
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify9(i1 %x) {
100*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify9(
101*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = select i1 %x, i32 5, i32 6
102*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP1]]
103*9880d681SAndroid Build Coastguard Worker;
104*9880d681SAndroid Build Coastguard Worker  %hello = getelementptr [6 x i8], [6 x i8]* @hello, i32 0, i32 0
105*9880d681SAndroid Build Coastguard Worker  %longer = getelementptr [7 x i8], [7 x i8]* @longer, i32 0, i32 0
106*9880d681SAndroid Build Coastguard Worker  %s = select i1 %x, i8* %hello, i8* %longer
107*9880d681SAndroid Build Coastguard Worker  %l = call i32 @strlen(i8* %s)
108*9880d681SAndroid Build Coastguard Worker  ret i32 %l
109*9880d681SAndroid Build Coastguard Worker}
110*9880d681SAndroid Build Coastguard Worker
111*9880d681SAndroid Build Coastguard Worker; Check the case that should be simplified to a sub instruction.
112*9880d681SAndroid Build Coastguard Worker; strlen(@hello + x) --> 5 - x
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify10(i32 %x) {
115*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify10(
116*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = sub i32 5, %x
117*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP1]]
118*9880d681SAndroid Build Coastguard Worker;
119*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr inbounds [6 x i8], [6 x i8]* @hello, i32 0, i32 %x
120*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
121*9880d681SAndroid Build Coastguard Worker  ret i32 %hello_l
122*9880d681SAndroid Build Coastguard Worker}
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; strlen(@null_hello_mid + (x & 7)) --> 9 - (x & 7)
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerdefine i32 @test_simplify11(i32 %x) {
127*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_simplify11(
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 %x, 7
129*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[TMP1:%.*]] = sub nsw i32 9, [[AND]]
130*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[TMP1]]
131*9880d681SAndroid Build Coastguard Worker;
132*9880d681SAndroid Build Coastguard Worker  %and = and i32 %x, 7
133*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr inbounds [13 x i8], [13 x i8]* @null_hello_mid, i32 0, i32 %and
134*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
135*9880d681SAndroid Build Coastguard Worker  ret i32 %hello_l
136*9880d681SAndroid Build Coastguard Worker}
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; Check cases that shouldn't be simplified.
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine i32 @test_no_simplify1() {
141*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify1(
142*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[A_L:%.*]] = call i32 @strlen(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @a, i32 0, i32 0))
143*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[A_L]]
144*9880d681SAndroid Build Coastguard Worker;
145*9880d681SAndroid Build Coastguard Worker  %a_p = getelementptr [32 x i8], [32 x i8]* @a, i32 0, i32 0
146*9880d681SAndroid Build Coastguard Worker  %a_l = call i32 @strlen(i8* %a_p)
147*9880d681SAndroid Build Coastguard Worker  ret i32 %a_l
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Worker; strlen(@null_hello + x) should not be simplified to a sub instruction.
151*9880d681SAndroid Build Coastguard Worker
152*9880d681SAndroid Build Coastguard Workerdefine i32 @test_no_simplify2(i32 %x) {
153*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify2(
154*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[HELLO_P:%.*]] = getelementptr inbounds [7 x i8], [7 x i8]* @null_hello, i32 0, i32 %x
155*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[HELLO_L:%.*]] = call i32 @strlen(i8* [[HELLO_P]])
156*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[HELLO_L]]
157*9880d681SAndroid Build Coastguard Worker;
158*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr inbounds [7 x i8], [7 x i8]* @null_hello, i32 0, i32 %x
159*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
160*9880d681SAndroid Build Coastguard Worker  ret i32 %hello_l
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; strlen(@null_hello_mid + (x & 15)) should not be simplified to a sub instruction.
164*9880d681SAndroid Build Coastguard Worker
165*9880d681SAndroid Build Coastguard Workerdefine i32 @test_no_simplify3(i32 %x) {
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_no_simplify3(
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[AND:%.*]] = and i32 %x, 15
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[HELLO_P:%.*]] = getelementptr inbounds [13 x i8], [13 x i8]* @null_hello_mid, i32 0, i32 [[AND]]
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[HELLO_L:%.*]] = call i32 @strlen(i8* [[HELLO_P]])
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[HELLO_L]]
171*9880d681SAndroid Build Coastguard Worker;
172*9880d681SAndroid Build Coastguard Worker  %and = and i32 %x, 15
173*9880d681SAndroid Build Coastguard Worker  %hello_p = getelementptr inbounds [13 x i8], [13 x i8]* @null_hello_mid, i32 0, i32 %and
174*9880d681SAndroid Build Coastguard Worker  %hello_l = call i32 @strlen(i8* %hello_p)
175*9880d681SAndroid Build Coastguard Worker  ret i32 %hello_l
176*9880d681SAndroid Build Coastguard Worker}
177*9880d681SAndroid Build Coastguard Worker
178