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. 4; 5; RUN: opt < %s -passes=instcombine -S | FileCheck %s 6 7declare i64 @strlen(i8*) 8 9@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] 10 11 12; Fold strlen(&a5_4[0][I]) to I <= 3 ? 3 - I : 0. 13 14define i64 @fold_a5_4_i0_pI(i64 %I) { 15; CHECK-LABEL: @fold_a5_4_i0_pI( 16; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 0, i64 [[I:%.*]] 17; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(i8* noundef nonnull dereferenceable(1) [[PTR]]) 18; CHECK-NEXT: ret i64 [[LEN]] 19; 20 %ptr = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 0, i64 %I 21 %len = call i64 @strlen(i8* %ptr) 22 ret i64 %len 23} 24 25 26; Fold strlen(&a5_4[1][I]) to I <= 2 ? 2 - I : 0. 27 28define i64 @fold_a5_4_i1_pI(i64 %I) { 29; CHECK-LABEL: @fold_a5_4_i1_pI( 30; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 1, i64 [[I:%.*]] 31; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(i8* noundef nonnull dereferenceable(1) [[PTR]]) 32; CHECK-NEXT: ret i64 [[LEN]] 33; 34 %ptr = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 1, i64 %I 35 %len = call i64 @strlen(i8* %ptr) 36 ret i64 %len 37} 38 39 40; Fold strlen(&a5_4[2][I]) to i <= 1 ? 1 - I : 0. 41 42define i64 @fold_a5_4_i2_pI(i64 %I) { 43; CHECK-LABEL: @fold_a5_4_i2_pI( 44; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(i8* noundef nonnull dereferenceable(1) getelementptr inbounds ([5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 2, i64 1)) 45; CHECK-NEXT: ret i64 [[LEN]] 46; 47 %ptr = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 2, i64 1 48 %len = call i64 @strlen(i8* %ptr) 49 ret i64 %len 50} 51 52 53; Fold strlen(&a5_4[3][I]) to 0. 54 55define i64 @fold_a5_4_i3_pI_to_0(i64 %I) { 56; CHECK-LABEL: @fold_a5_4_i3_pI_to_0( 57; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 3, i64 [[I:%.*]] 58; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(i8* noundef nonnull dereferenceable(1) [[PTR]]) 59; CHECK-NEXT: ret i64 [[LEN]] 60; 61 %ptr = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 3, i64 %I 62 %len = call i64 @strlen(i8* %ptr) 63 ret i64 %len 64} 65 66 67; Fold strlen(&a5_4[4][I]) to 0. 68 69define i64 @fold_a5_4_i4_pI_to_0(i64 %I) { 70; CHECK-LABEL: @fold_a5_4_i4_pI_to_0( 71; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 4, i64 [[I:%.*]] 72; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(i8* noundef nonnull dereferenceable(1) [[PTR]]) 73; CHECK-NEXT: ret i64 [[LEN]] 74; 75 %ptr = getelementptr [5 x [4 x i8]], [5 x [4 x i8]]* @a5_4, i64 0, i64 4, i64 %I 76 %len = call i64 @strlen(i8* %ptr) 77 ret i64 %len 78} 79