brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.0 KiB · 4c6585e Raw
340 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt < %s -passes=instcombine -S | FileCheck %s3;4; Exercise folding of strncmp calls with constant arrays and nonconstant5; sizes.6 7declare i32 @strncmp(ptr, ptr, i64)8 9@ax = external constant [8 x i8]10@a01230123 = constant [8 x i8] c"01230123"11@b01230123 = constant [8 x i8] c"01230123"12@c01230129 = constant [8 x i8] c"01230129"13@d9123_12  = constant [7 x i8] c"9123\0012"14@e9123_34  = constant [7 x i8] c"9123\0034"15 16 17; Exercise strncmp(A, B, N) folding of arrays with the same bytes.18 19define void @fold_strncmp_a_b_n(ptr %pcmp, i64 %n) {20; CHECK-LABEL: @fold_strncmp_a_b_n(21; CHECK-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 422; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[N:%.*]], 023; CHECK-NEXT:    [[C0_1:%.*]] = sext i1 [[TMP1]] to i3224; CHECK-NEXT:    [[S0_1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 425; CHECK-NEXT:    store i32 [[C0_1]], ptr [[S0_1]], align 426; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[N]], 027; CHECK-NEXT:    [[C0_2:%.*]] = sext i1 [[TMP2]] to i3228; CHECK-NEXT:    [[S0_2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 829; CHECK-NEXT:    store i32 [[C0_2]], ptr [[S0_2]], align 430; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i64 [[N]], 031; CHECK-NEXT:    [[C0_3:%.*]] = sext i1 [[TMP3]] to i3232; CHECK-NEXT:    [[S0_3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1233; CHECK-NEXT:    store i32 [[C0_3]], ptr [[S0_3]], align 434; CHECK-NEXT:    [[S0_4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1635; CHECK-NEXT:    store i32 0, ptr [[S0_4]], align 436; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i64 [[N]], 037; CHECK-NEXT:    [[C0_5:%.*]] = sext i1 [[TMP4]] to i3238; CHECK-NEXT:    [[S0_5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2039; CHECK-NEXT:    store i32 [[C0_5]], ptr [[S0_5]], align 440; CHECK-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[N]], 041; CHECK-NEXT:    [[C5_0:%.*]] = zext i1 [[TMP5]] to i3242; CHECK-NEXT:    [[S5_0:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2443; CHECK-NEXT:    store i32 [[C5_0]], ptr [[S5_0]], align 444; CHECK-NEXT:    ret void45;46 47 48  %q1 = getelementptr [8 x i8], ptr @b01230123, i64 0, i64 149  %q2 = getelementptr [8 x i8], ptr @b01230123, i64 0, i64 250  %q3 = getelementptr [8 x i8], ptr @b01230123, i64 0, i64 351  %q4 = getelementptr [8 x i8], ptr @b01230123, i64 0, i64 452  %q5 = getelementptr [8 x i8], ptr @b01230123, i64 0, i64 553 54  ; Fold strncmp(a, b, n) to 0.55  %c0_0 = call i32 @strncmp(ptr @a01230123, ptr @b01230123, i64 %n)56  store i32 %c0_0, ptr %pcmp57 58  ; Fold strncmp(a, b + 1, n) to N != 0 ? -1 : 0.59  %c0_1 = call i32 @strncmp(ptr @a01230123, ptr %q1, i64 %n)60  %s0_1 = getelementptr i32, ptr %pcmp, i64 161  store i32 %c0_1, ptr %s0_162 63  ; Fold strncmp(a, b + 2, n) to N != 0 ? -1 : 0.64  %c0_2 = call i32 @strncmp(ptr @a01230123, ptr %q2, i64 %n)65  %s0_2 = getelementptr i32, ptr %pcmp, i64 266  store i32 %c0_2, ptr %s0_267 68  ; Fold strncmp(a, b + 3, n) to N != 0 ? -1 : 0.69  %c0_3 = call i32 @strncmp(ptr @a01230123, ptr %q3, i64 %n)70  %s0_3 = getelementptr i32, ptr %pcmp, i64 371  store i32 %c0_3, ptr %s0_372 73  ; Fold strncmp(a, b + 4, n) to 0.74  %c0_4 = call i32 @strncmp(ptr @a01230123, ptr %q4, i64 %n)75  %s0_4 = getelementptr i32, ptr %pcmp, i64 476  store i32 %c0_4, ptr %s0_477 78  ; Fold strncmp(a, b + 5, n) to N != 0 ? -1 : 0.79  %c0_5 = call i32 @strncmp(ptr @a01230123, ptr %q5, i64 %n)80  %s0_5 = getelementptr i32, ptr %pcmp, i64 581  store i32 %c0_5, ptr %s0_582 83  ; Fold strncmp(b + 5, a, n) to N != 0 ? +1 : 0.84  %c5_0 = call i32 @strncmp(ptr %q5, ptr @a01230123, i64 %n)85  %s5_0 = getelementptr i32, ptr %pcmp, i64 686  store i32 %c5_0, ptr %s5_087 88  ret void89}90 91; Vefify that a strncmp() call involving a constant array with unknown92; contents is not folded.93 94define void @call_strncmp_a_ax_n(ptr %pcmp, i64 %n) {95; CHECK-LABEL: @call_strncmp_a_ax_n(96; CHECK-NEXT:    [[C0_0:%.*]] = call i32 @strncmp(ptr nonnull @a01230123, ptr nonnull @ax, i64 [[N:%.*]])97; CHECK-NEXT:    store i32 [[C0_0]], ptr [[PCMP:%.*]], align 498; CHECK-NEXT:    ret void99;100 101 102  ; Do not fold strncmp(a, ax, n).103  %c0_0 = call i32 @strncmp(ptr @a01230123, ptr @ax, i64 %n)104  store i32 %c0_0, ptr %pcmp105 106  ret void107}108 109 110; Exercise strncmp(A, C, N) folding of arrays with the same leading bytes111; but a difference in the trailing byte.112 113define void @fold_strncmp_a_c_n(ptr %pcmp, i64 %n) {114; CHECK-LABEL: @fold_strncmp_a_c_n(115; CHECK-NEXT:    [[TMP1:%.*]] = icmp ugt i64 [[N:%.*]], 7116; CHECK-NEXT:    [[C0_0:%.*]] = sext i1 [[TMP1]] to i32117; CHECK-NEXT:    store i32 [[C0_0]], ptr [[PCMP:%.*]], align 4118; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[N]], 0119; CHECK-NEXT:    [[C0_1:%.*]] = sext i1 [[TMP2]] to i32120; CHECK-NEXT:    [[S0_1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4121; CHECK-NEXT:    store i32 [[C0_1]], ptr [[S0_1]], align 4122; CHECK-NEXT:    [[TMP3:%.*]] = icmp ne i64 [[N]], 0123; CHECK-NEXT:    [[C0_2:%.*]] = sext i1 [[TMP3]] to i32124; CHECK-NEXT:    [[S0_2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8125; CHECK-NEXT:    store i32 [[C0_2]], ptr [[S0_2]], align 4126; CHECK-NEXT:    [[TMP4:%.*]] = icmp ne i64 [[N]], 0127; CHECK-NEXT:    [[C0_3:%.*]] = sext i1 [[TMP4]] to i32128; CHECK-NEXT:    [[S0_3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 12129; CHECK-NEXT:    store i32 [[C0_3]], ptr [[S0_3]], align 4130; CHECK-NEXT:    [[TMP5:%.*]] = icmp ugt i64 [[N]], 3131; CHECK-NEXT:    [[C0_4:%.*]] = sext i1 [[TMP5]] to i32132; CHECK-NEXT:    [[S0_4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16133; CHECK-NEXT:    store i32 [[C0_4]], ptr [[S0_4]], align 4134; CHECK-NEXT:    [[TMP6:%.*]] = icmp ugt i64 [[N]], 3135; CHECK-NEXT:    [[C0_5:%.*]] = sext i1 [[TMP6]] to i32136; CHECK-NEXT:    [[S0_5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 20137; CHECK-NEXT:    store i32 [[C0_5]], ptr [[S0_5]], align 4138; CHECK-NEXT:    ret void139;140 141 142  %q1 = getelementptr [8 x i8], ptr @c01230129, i64 0, i64 1143  %q2 = getelementptr [8 x i8], ptr @c01230129, i64 0, i64 2144  %q3 = getelementptr [8 x i8], ptr @c01230129, i64 0, i64 3145  %q4 = getelementptr [8 x i8], ptr @c01230129, i64 0, i64 4146  %q5 = getelementptr [8 x i8], ptr @c01230129, i64 0, i64 5147 148  ; Fold strncmp(a, c, n) to N > 7 ? -1 : 0.149  %c0_0 = call i32 @strncmp(ptr @a01230123, ptr @c01230129, i64 %n)150  store i32 %c0_0, ptr %pcmp151 152  ; Fold strncmp(a, c + 1, n) to N != 0 ? -1 : 0.153  %c0_1 = call i32 @strncmp(ptr @a01230123, ptr %q1, i64 %n)154  %s0_1 = getelementptr i32, ptr %pcmp, i64 1155  store i32 %c0_1, ptr %s0_1156 157  ; Fold strncmp(a, c + 2, n) to N != 0 ? -1 : 0.158  %c0_2 = call i32 @strncmp(ptr @a01230123, ptr %q2, i64 %n)159  %s0_2 = getelementptr i32, ptr %pcmp, i64 2160  store i32 %c0_2, ptr %s0_2161 162  ; Fold strncmp(a, c + 3, n) to N != 0 ? -1 : 0.163  %c0_3 = call i32 @strncmp(ptr @a01230123, ptr %q3, i64 %n)164  %s0_3 = getelementptr i32, ptr %pcmp, i64 3165  store i32 %c0_3, ptr %s0_3166 167  ; Fold strncmp(a, c + 4, n) to N > 3 ? -1 : 0.168  %c0_4 = call i32 @strncmp(ptr @a01230123, ptr %q4, i64 %n)169  %s0_4 = getelementptr i32, ptr %pcmp, i64 4170  store i32 %c0_4, ptr %s0_4171 172  ; Fold strncmp(a, c + 5, n) to N != 0 ? -1 : 0.173  %c0_5 = call i32 @strncmp(ptr @a01230123, ptr %q4, i64 %n)174  %s0_5 = getelementptr i32, ptr %pcmp, i64 5175  store i32 %c0_5, ptr %s0_5176 177  ret void178}179 180 181; Exercise strncmp(A, D, N) folding of arrays of different sizes and182; a difference in the leading byte.183 184define void @fold_strncmp_a_d_n(ptr %pcmp, i64 %n) {185; CHECK-LABEL: @fold_strncmp_a_d_n(186; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[N:%.*]], 0187; CHECK-NEXT:    [[C0_0:%.*]] = sext i1 [[TMP1]] to i32188; CHECK-NEXT:    store i32 [[C0_0]], ptr [[PCMP:%.*]], align 4189; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[N]], 0190; CHECK-NEXT:    [[C0_1:%.*]] = sext i1 [[TMP2]] to i32191; CHECK-NEXT:    [[S0_1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4192; CHECK-NEXT:    store i32 [[C0_1]], ptr [[S0_1]], align 4193; CHECK-NEXT:    [[TMP3:%.*]] = icmp ugt i64 [[N]], 3194; CHECK-NEXT:    [[C1_1:%.*]] = zext i1 [[TMP3]] to i32195; CHECK-NEXT:    [[S1_1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8196; CHECK-NEXT:    store i32 [[C1_1]], ptr [[S1_1]], align 4197; CHECK-NEXT:    [[TMP4:%.*]] = icmp ugt i64 [[N]], 2198; CHECK-NEXT:    [[C2_2:%.*]] = zext i1 [[TMP4]] to i32199; CHECK-NEXT:    [[S2_2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 12200; CHECK-NEXT:    store i32 [[C2_2]], ptr [[S2_2]], align 4201; CHECK-NEXT:    [[TMP5:%.*]] = icmp ne i64 [[N]], 0202; CHECK-NEXT:    [[C4_4:%.*]] = zext i1 [[TMP5]] to i32203; CHECK-NEXT:    [[S4_4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16204; CHECK-NEXT:    store i32 [[C4_4]], ptr [[S4_4]], align 4205; CHECK-NEXT:    [[TMP6:%.*]] = icmp ne i64 [[N]], 0206; CHECK-NEXT:    [[C4_4_2:%.*]] = sext i1 [[TMP6]] to i32207; CHECK-NEXT:    [[S4_4_2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 20208; CHECK-NEXT:    store i32 [[C4_4_2]], ptr [[S4_4_2]], align 4209; CHECK-NEXT:    [[S5_5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24210; CHECK-NEXT:    store i32 0, ptr [[S5_5]], align 4211; CHECK-NEXT:    [[S6_6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 28212; CHECK-NEXT:    store i32 0, ptr [[S6_6]], align 4213; CHECK-NEXT:    ret void214;215 216  %p1 = getelementptr [8 x i8], ptr @a01230123, i64 0, i64 1217  %p2 = getelementptr [8 x i8], ptr @a01230123, i64 0, i64 2218  %p3 = getelementptr [8 x i8], ptr @a01230123, i64 0, i64 3219  %p4 = getelementptr [8 x i8], ptr @a01230123, i64 0, i64 4220  %p5 = getelementptr [8 x i8], ptr @a01230123, i64 0, i64 5221  %p6 = getelementptr [8 x i8], ptr @a01230123, i64 0, i64 6222 223  %q1 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 1224  %q2 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 2225  %q3 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 3226  %q4 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 4227  %q5 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 5228  %q6 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 6229 230  ; Fold strncmp(a, d, n) to N != 0 ? -1 : 0.231  %c0_0 = call i32 @strncmp(ptr @a01230123, ptr @d9123_12, i64 %n)232  store i32 %c0_0, ptr %pcmp233 234  ; Fold strncmp(a, d + 1, n) to N != 0 ? -1 : 0.235  %c0_1 = call i32 @strncmp(ptr @a01230123, ptr %q1, i64 %n)236  %s0_1 = getelementptr i32, ptr %pcmp, i64 1237  store i32 %c0_1, ptr %s0_1238 239  ; Fold strncmp(a + 1, d + 1, n) N > 3 ? +1 : 0.240  %c1_1 = call i32 @strncmp(ptr %p1, ptr %q1, i64 %n)241  %s1_1 = getelementptr i32, ptr %pcmp, i64 2242  store i32 %c1_1, ptr %s1_1243 244  ; Fold strncmp(a + 2, d + 2, n) N > 2 ? +1 : 0.245  %c2_2 = call i32 @strncmp(ptr %p2, ptr %q2, i64 %n)246  %s2_2 = getelementptr i32, ptr %pcmp, i64 3247  store i32 %c2_2, ptr %s2_2248 249  ; Fold strncmp(a + 3, d + 3, n) N > 1 ? +1 : 0.250  %c3_3 = call i32 @strncmp(ptr %p3, ptr %q3, i64 %n)251  %s3_3 = getelementptr i32, ptr %pcmp, i64 4252  store i32 %c3_3, ptr %s3_3253 254  ; Fold strncmp(a + 4, d + 4, n) N != 0 ? +1 : 0.255  %c4_4 = call i32 @strncmp(ptr %p4, ptr %q4, i64 %n)256  %s4_4 = getelementptr i32, ptr %pcmp, i64 4257  store i32 %c4_4, ptr %s4_4258 259  ; Fold strncmp(d + 4, a + 4, n) N != 0 ? -1 : 0 (same as above but260  ; with the array arguments reversed).261  %c4_4_2 = call i32 @strncmp(ptr %q4, ptr %p4, i64 %n)262  %s4_4_2 = getelementptr i32, ptr %pcmp, i64 5263  store i32 %c4_4_2, ptr %s4_4_2264 265  ; Fold strncmp(a + 5, d + 5, n) to 0.266  %c5_5 = call i32 @strncmp(ptr %p5, ptr %q5, i64 %n)267  %s5_5 = getelementptr i32, ptr %pcmp, i64 6268  store i32 %c5_5, ptr %s5_5269 270  ; Fold strncmp(a + 6, d + 6, n) to 0.271  %c6_6 = call i32 @strncmp(ptr %p6, ptr %q6, i64 %n)272  %s6_6 = getelementptr i32, ptr %pcmp, i64 7273  store i32 %c6_6, ptr %s6_6274 275  ret void276}277 278 279; Exercise strncmp(A, D, N) folding of arrays with the same bytes and280; a nonzero size.281 282define void @fold_strncmp_a_d_nz(ptr %pcmp, i64 %n) {283; CHECK-LABEL: @fold_strncmp_a_d_nz(284; CHECK-NEXT:    store i32 -1, ptr [[PCMP:%.*]], align 4285; CHECK-NEXT:    ret void286;287 288  %nz = or i64 %n, 1289 290  %c0_0 = call i32 @strncmp(ptr @a01230123, ptr @d9123_12, i64 %nz)291  store i32 %c0_0, ptr %pcmp292 293  ret void294}295 296 297; Exercise strncmp(D, E, N) folding of equal strings but unequal arrays.298 299define void @fold_strncmp_d_e_n(ptr %pcmp, i64 %n) {300; CHECK-LABEL: @fold_strncmp_d_e_n(301; CHECK-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 4302; CHECK-NEXT:    [[TMP1:%.*]] = icmp ne i64 [[N:%.*]], 0303; CHECK-NEXT:    [[C0_1:%.*]] = zext i1 [[TMP1]] to i32304; CHECK-NEXT:    [[S0_1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4305; CHECK-NEXT:    store i32 [[C0_1]], ptr [[S0_1]], align 4306; CHECK-NEXT:    [[TMP2:%.*]] = icmp ne i64 [[N]], 0307; CHECK-NEXT:    [[C1_0:%.*]] = sext i1 [[TMP2]] to i32308; CHECK-NEXT:    [[S1_0:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8309; CHECK-NEXT:    store i32 [[C1_0]], ptr [[S1_0]], align 4310; CHECK-NEXT:    [[S1_1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 12311; CHECK-NEXT:    store i32 0, ptr [[S1_1]], align 4312; CHECK-NEXT:    ret void313;314 315  %p1 = getelementptr [7 x i8], ptr @d9123_12, i64 0, i64 1316 317  %q1 = getelementptr [7 x i8], ptr @e9123_34, i64 0, i64 1318 319  ; Fold to 0.320  %c0_0 = call i32 @strncmp(ptr @d9123_12, ptr @e9123_34, i64 %n)321  store i32 %c0_0, ptr %pcmp322 323  ; Fold to N ? +1 : 0.324  %c0_1 = call i32 @strncmp(ptr @d9123_12, ptr %q1, i64 %n)325  %s0_1 = getelementptr i32, ptr %pcmp, i64 1326  store i32 %c0_1, ptr %s0_1327 328  ; Fold to N ? -1 : 0.329  %c1_0 = call i32 @strncmp(ptr %p1, ptr @e9123_34, i64 %n)330  %s1_0 = getelementptr i32, ptr %pcmp, i64 2331  store i32 %c1_0, ptr %s1_0332 333  ; Fold to 0.334  %c1_1 = call i32 @strncmp(ptr %p1, ptr %q1, i64 %n)335  %s1_1 = getelementptr i32, ptr %pcmp, i64 3336  store i32 %c1_1, ptr %s1_1337 338  ret void339}340