248 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that strlen calls with elements of constant arrays are folded.3;4; RUN: opt < %s -passes=instcombine -S | FileCheck %s5 6declare i64 @strlen(ptr)7 8@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]9 10 11; Fold strlen(a5_4[0]) to 3.12 13define i64 @fold_a5_4_i0_to_3() {14; CHECK-LABEL: @fold_a5_4_i0_to_3(15; CHECK-NEXT: ret i64 316;17 %len = call i64 @strlen(ptr @a5_4)18 ret i64 %len19}20 21 22; Fold strlen(&a5_4[0][1]) to 2.23 24define i64 @fold_a5_4_i0_p1_to_2() {25; CHECK-LABEL: @fold_a5_4_i0_p1_to_2(26; CHECK-NEXT: ret i64 227;28 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 129 %len = call i64 @strlen(ptr %ptr)30 ret i64 %len31}32 33 34; Fold strlen(&a5_4[0][2]) to 1.35 36define i64 @fold_a5_4_i0_p2_to_1() {37; CHECK-LABEL: @fold_a5_4_i0_p2_to_1(38; CHECK-NEXT: ret i64 139;40 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 241 %len = call i64 @strlen(ptr %ptr)42 ret i64 %len43}44 45 46; Fold strlen(&a5_4[0][3]) to 0.47 48define i64 @fold_a5_4_i0_p3_to_0() {49; CHECK-LABEL: @fold_a5_4_i0_p3_to_0(50; CHECK-NEXT: ret i64 051;52 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 0, i64 353 %len = call i64 @strlen(ptr %ptr)54 ret i64 %len55}56 57 58; Fold strlen(a5_4[1]) to 2.59 60define i64 @fold_a5_4_i1_to_2() {61; CHECK-LABEL: @fold_a5_4_i1_to_2(62; CHECK-NEXT: ret i64 263;64 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 065 %len = call i64 @strlen(ptr %ptr)66 ret i64 %len67}68 69 70; Fold strlen(&a5_4[1][1]) to 1.71 72define i64 @fold_a5_4_i1_p1_to_1() {73; CHECK-LABEL: @fold_a5_4_i1_p1_to_1(74; CHECK-NEXT: ret i64 175;76 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 177 %len = call i64 @strlen(ptr %ptr)78 ret i64 %len79}80 81 82; Fold strlen(&a5_4[1][2]) to 0.83 84define i64 @fold_a5_4_i1_p2_to_0() {85; CHECK-LABEL: @fold_a5_4_i1_p2_to_0(86; CHECK-NEXT: ret i64 087;88 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 289 %len = call i64 @strlen(ptr %ptr)90 ret i64 %len91}92 93 94; Fold strlen(&a5_4[1][3]) to 0.95 96define i64 @fold_a5_4_i1_p3_to_0() {97; CHECK-LABEL: @fold_a5_4_i1_p3_to_0(98; CHECK-NEXT: ret i64 099;100 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 1, i64 3101 %len = call i64 @strlen(ptr %ptr)102 ret i64 %len103}104 105 106; Fold strlen(a5_4[2]) to 1.107 108define i64 @fold_a5_4_i2_to_1() {109; CHECK-LABEL: @fold_a5_4_i2_to_1(110; CHECK-NEXT: ret i64 1111;112 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 0113 %len = call i64 @strlen(ptr %ptr)114 ret i64 %len115}116 117 118; Fold strlen(&a5_4[2][1]) to 0.119 120define i64 @fold_a5_4_i2_p1_to_0() {121; CHECK-LABEL: @fold_a5_4_i2_p1_to_0(122; CHECK-NEXT: ret i64 0123;124 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 1125 %len = call i64 @strlen(ptr %ptr)126 ret i64 %len127}128 129 130; Fold strlen(&a5_4[2][2]) to 0.131 132define i64 @fold_a5_4_i2_p2_to_0() {133; CHECK-LABEL: @fold_a5_4_i2_p2_to_0(134; CHECK-NEXT: ret i64 0135;136 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 2137 %len = call i64 @strlen(ptr %ptr)138 ret i64 %len139}140 141 142; Fold strlen(&a5_4[2][3]) to 0.143 144define i64 @fold_a5_4_i2_p3_to_0() {145; CHECK-LABEL: @fold_a5_4_i2_p3_to_0(146; CHECK-NEXT: ret i64 0147;148 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 2, i64 3149 %len = call i64 @strlen(ptr %ptr)150 ret i64 %len151}152 153 154; Fold strlen(a5_4[3]) to 0155 156define i64 @fold_a5_4_i3_to_0() {157; CHECK-LABEL: @fold_a5_4_i3_to_0(158; CHECK-NEXT: ret i64 0159;160 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 0161 %len = call i64 @strlen(ptr %ptr)162 ret i64 %len163}164 165 166; Fold strlen(&a5_4[3][1]) to 0167 168define i64 @fold_a5_4_i3_p1_to_0() {169; CHECK-LABEL: @fold_a5_4_i3_p1_to_0(170; CHECK-NEXT: ret i64 0171;172 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 1173 %len = call i64 @strlen(ptr %ptr)174 ret i64 %len175}176 177 178; Fold strlen(&a5_4[3][2]) to 0179 180define i64 @fold_a5_4_i3_p2_to_0() {181; CHECK-LABEL: @fold_a5_4_i3_p2_to_0(182; CHECK-NEXT: ret i64 0183;184 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 2185 %len = call i64 @strlen(ptr %ptr)186 ret i64 %len187}188 189 190; Fold strlen(&a5_4[3][3]) to 0191 192define i64 @fold_a5_3_i4_p3_to_0() {193; CHECK-LABEL: @fold_a5_3_i4_p3_to_0(194; CHECK-NEXT: ret i64 0195;196 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 3, i64 3197 %len = call i64 @strlen(ptr %ptr)198 ret i64 %len199}200 201 202; Fold strlen(a5_4[4]) to 0203 204define i64 @fold_a5_4_i4_to_0() {205; CHECK-LABEL: @fold_a5_4_i4_to_0(206; CHECK-NEXT: ret i64 0207;208 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 0209 %len = call i64 @strlen(ptr %ptr)210 ret i64 %len211}212 213 214; Fold strlen(&a5_4[4][1]) to 0215 216define i64 @fold_a5_4_i4_p1_to_0() {217; CHECK-LABEL: @fold_a5_4_i4_p1_to_0(218; CHECK-NEXT: ret i64 0219;220 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 1221 %len = call i64 @strlen(ptr %ptr)222 ret i64 %len223}224 225 226; Fold strlen(&a5_4[4][2]) to 0227 228define i64 @fold_a5_4_i4_p2_to_0() {229; CHECK-LABEL: @fold_a5_4_i4_p2_to_0(230; CHECK-NEXT: ret i64 0231;232 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 2233 %len = call i64 @strlen(ptr %ptr)234 ret i64 %len235}236 237 238; Fold strlen(&a5_4[4][3]) to 0239 240define i64 @fold_a5_4_i4_p3_to_0() {241; CHECK-LABEL: @fold_a5_4_i4_p3_to_0(242; CHECK-NEXT: ret i64 0243;244 %ptr = getelementptr [5 x [4 x i8]], ptr @a5_4, i64 0, i64 4, i64 3245 %len = call i64 @strlen(ptr %ptr)246 ret i64 %len247}248