Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / InstCombine / strlen-8.ll
blobb4334ddd8f1ac323b33c3bbe337dd37839cb5833
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; Verify that strlen calls with variable offsets into elements of constant
3 ; arrays are folded.
5 ; TODO: None of these cases is folded at the moment due to a limitation
6 ; in LibCallSimplifier::optimizeStringLength.
8 ; RUN: opt < %s -passes=instcombine -S | FileCheck %s
10 declare i64 @strlen(ptr)
12 @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]
15 ; Fold strlen(&a5_4[0][I]) to I <= 3 ? 3 - I : 0.
17 define i64 @fold_a5_4_i0_pI(i64 %I) {
18 ; CHECK-LABEL: @fold_a5_4_i0_pI(
19 ; CHECK-NEXT:    [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 [[I:%.*]]
20 ; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]])
21 ; CHECK-NEXT:    ret i64 [[LEN]]
23   %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 %I
24   %len = call i64 @strlen(ptr %ptr)
25   ret i64 %len
29 ; Fold strlen(&a5_4[1][I]) to I <= 2 ? 2 - I : 0.
31 define i64 @fold_a5_4_i1_pI(i64 %I) {
32 ; CHECK-LABEL: @fold_a5_4_i1_pI(
33 ; CHECK-NEXT:    [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 [[I:%.*]]
34 ; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]])
35 ; CHECK-NEXT:    ret i64 [[LEN]]
37   %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 %I
38   %len = call i64 @strlen(ptr %ptr)
39   ret i64 %len
43 ; Fold strlen(&a5_4[2][I]) to i <= 1 ? 1 - I : 0.
45 define i64 @fold_a5_4_i2_pI(i64 %I) {
46 ; CHECK-LABEL: @fold_a5_4_i2_pI(
47 ; CHECK-NEXT:    [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 [[I:%.*]]
48 ; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]])
49 ; CHECK-NEXT:    ret i64 [[LEN]]
51   %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 %I
52   %len = call i64 @strlen(ptr %ptr)
53   ret i64 %len
57 ; Fold strlen(&a5_4[3][I]) to 0.
59 define i64 @fold_a5_4_i3_pI_to_0(i64 %I) {
60 ; CHECK-LABEL: @fold_a5_4_i3_pI_to_0(
61 ; CHECK-NEXT:    [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 [[I:%.*]]
62 ; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]])
63 ; CHECK-NEXT:    ret i64 [[LEN]]
65   %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 %I
66   %len = call i64 @strlen(ptr %ptr)
67   ret i64 %len
71 ; Fold strlen(&a5_4[4][I]) to 0.
73 define i64 @fold_a5_4_i4_pI_to_0(i64 %I) {
74 ; CHECK-LABEL: @fold_a5_4_i4_pI_to_0(
75 ; CHECK-NEXT:    [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 [[I:%.*]]
76 ; CHECK-NEXT:    [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]])
77 ; CHECK-NEXT:    ret i64 [[LEN]]
79   %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 %I
80   %len = call i64 @strlen(ptr %ptr)
81   ret i64 %len