1cc2ce81bSMartin Sebor; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2cc2ce81bSMartin Sebor; Verify that strlen calls with variable offsets into elements of constant 3cc2ce81bSMartin Sebor; arrays are folded. 4cc2ce81bSMartin Sebor; 5b19194c0SMartin Sebor; TODO: None of these cases is folded at the moment due to a limitation 6b19194c0SMartin Sebor; in LibCallSimplifier::optimizeStringLength. 7b19194c0SMartin Sebor; 8cc2ce81bSMartin Sebor; RUN: opt < %s -passes=instcombine -S | FileCheck %s 9cc2ce81bSMartin Sebor 10*4ab40ecaSBjorn Petterssondeclare i64 @strlen(ptr) 11cc2ce81bSMartin Sebor 12cc2ce81bSMartin Sebor@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] 13cc2ce81bSMartin Sebor 14cc2ce81bSMartin Sebor 15cc2ce81bSMartin Sebor; Fold strlen(&a5_4[0][I]) to I <= 3 ? 3 - I : 0. 16cc2ce81bSMartin Sebor 17cc2ce81bSMartin Sebordefine i64 @fold_a5_4_i0_pI(i64 %I) { 18cc2ce81bSMartin Sebor; CHECK-LABEL: @fold_a5_4_i0_pI( 19*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 [[I:%.*]] 20*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]]) 21cc2ce81bSMartin Sebor; CHECK-NEXT: ret i64 [[LEN]] 22cc2ce81bSMartin Sebor; 23*4ab40ecaSBjorn Pettersson %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 %I 24*4ab40ecaSBjorn Pettersson %len = call i64 @strlen(ptr %ptr) 25cc2ce81bSMartin Sebor ret i64 %len 26cc2ce81bSMartin Sebor} 27cc2ce81bSMartin Sebor 28cc2ce81bSMartin Sebor 29cc2ce81bSMartin Sebor; Fold strlen(&a5_4[1][I]) to I <= 2 ? 2 - I : 0. 30cc2ce81bSMartin Sebor 31cc2ce81bSMartin Sebordefine i64 @fold_a5_4_i1_pI(i64 %I) { 32cc2ce81bSMartin Sebor; CHECK-LABEL: @fold_a5_4_i1_pI( 33*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 [[I:%.*]] 34*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]]) 35cc2ce81bSMartin Sebor; CHECK-NEXT: ret i64 [[LEN]] 36cc2ce81bSMartin Sebor; 37*4ab40ecaSBjorn Pettersson %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 %I 38*4ab40ecaSBjorn Pettersson %len = call i64 @strlen(ptr %ptr) 39cc2ce81bSMartin Sebor ret i64 %len 40cc2ce81bSMartin Sebor} 41cc2ce81bSMartin Sebor 42cc2ce81bSMartin Sebor 43cc2ce81bSMartin Sebor; Fold strlen(&a5_4[2][I]) to i <= 1 ? 1 - I : 0. 44cc2ce81bSMartin Sebor 45cc2ce81bSMartin Sebordefine i64 @fold_a5_4_i2_pI(i64 %I) { 46cc2ce81bSMartin Sebor; CHECK-LABEL: @fold_a5_4_i2_pI( 47*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 [[I:%.*]] 48*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]]) 49cc2ce81bSMartin Sebor; CHECK-NEXT: ret i64 [[LEN]] 50cc2ce81bSMartin Sebor; 51*4ab40ecaSBjorn Pettersson %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 %I 52*4ab40ecaSBjorn Pettersson %len = call i64 @strlen(ptr %ptr) 53cc2ce81bSMartin Sebor ret i64 %len 54cc2ce81bSMartin Sebor} 55cc2ce81bSMartin Sebor 56cc2ce81bSMartin Sebor 57cc2ce81bSMartin Sebor; Fold strlen(&a5_4[3][I]) to 0. 58cc2ce81bSMartin Sebor 59cc2ce81bSMartin Sebordefine i64 @fold_a5_4_i3_pI_to_0(i64 %I) { 60cc2ce81bSMartin Sebor; CHECK-LABEL: @fold_a5_4_i3_pI_to_0( 61*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 [[I:%.*]] 62*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]]) 63cc2ce81bSMartin Sebor; CHECK-NEXT: ret i64 [[LEN]] 64cc2ce81bSMartin Sebor; 65*4ab40ecaSBjorn Pettersson %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 %I 66*4ab40ecaSBjorn Pettersson %len = call i64 @strlen(ptr %ptr) 67cc2ce81bSMartin Sebor ret i64 %len 68cc2ce81bSMartin Sebor} 69cc2ce81bSMartin Sebor 70cc2ce81bSMartin Sebor 71cc2ce81bSMartin Sebor; Fold strlen(&a5_4[4][I]) to 0. 72cc2ce81bSMartin Sebor 73cc2ce81bSMartin Sebordefine i64 @fold_a5_4_i4_pI_to_0(i64 %I) { 74cc2ce81bSMartin Sebor; CHECK-LABEL: @fold_a5_4_i4_pI_to_0( 75*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[PTR:%.*]] = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 [[I:%.*]] 76*4ab40ecaSBjorn Pettersson; CHECK-NEXT: [[LEN:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PTR]]) 77cc2ce81bSMartin Sebor; CHECK-NEXT: ret i64 [[LEN]] 78cc2ce81bSMartin Sebor; 79*4ab40ecaSBjorn Pettersson %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 %I 80*4ab40ecaSBjorn Pettersson %len = call i64 @strlen(ptr %ptr) 81cc2ce81bSMartin Sebor ret i64 %len 82cc2ce81bSMartin Sebor} 83