brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.6 KiB · b226501 Raw
148 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that strncmp calls with members of constant structs are folded.3;4; RUN: opt < %s -passes=instcombine -S | FileCheck %s5 6; struct A { char a[3], b[4], c[4]; };7%struct.A = type { [3 x i8], [4 x i8], [4 x i8] }8 9@a = constant %struct.A { [3 x i8] c"123", [4 x i8] c"1231", [4 x i8] c"2345" }10 11declare i32 @strncmp(ptr, ptr, i64)12 13define void @fold_strncmp_Aa_b(ptr %pcmp) {14; CHECK-LABEL: @fold_strncmp_Aa_b(15; CHECK-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 416; CHECK-NEXT:    [[PCMP1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 417; CHECK-NEXT:    store i32 0, ptr [[PCMP1]], align 418; CHECK-NEXT:    [[PCMP2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 819; CHECK-NEXT:    store i32 0, ptr [[PCMP2]], align 420; CHECK-NEXT:    [[PCMP3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1221; CHECK-NEXT:    store i32 0, ptr [[PCMP3]], align 422; CHECK-NEXT:    [[PCMP4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1623; CHECK-NEXT:    store i32 0, ptr [[PCMP4]], align 424; CHECK-NEXT:    [[PCMP5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2025; CHECK-NEXT:    store i32 0, ptr [[PCMP5]], align 426; CHECK-NEXT:    [[PCMP6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2427; CHECK-NEXT:    store i32 0, ptr [[PCMP6]], align 428; CHECK-NEXT:    [[PCMP7:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2829; CHECK-NEXT:    store i32 -1, ptr [[PCMP7]], align 430; CHECK-NEXT:    [[PCMP8:%.*]] = getelementptr i8, ptr [[PCMP]], i64 3231; CHECK-NEXT:    store i32 -1, ptr [[PCMP8]], align 432; CHECK-NEXT:    [[PCMP9:%.*]] = getelementptr i8, ptr [[PCMP]], i64 3633; CHECK-NEXT:    store i32 -1, ptr [[PCMP9]], align 434; CHECK-NEXT:    ret void35;36; p1 = a.a37; p2 = a.b38  %p2 = getelementptr %struct.A, ptr @a, i32 0, i32 1, i32 039 40; Fold strncmp(a.a = "123", a.b = "1231", 0) to 0.41  %cmp0 = call i32 @strncmp(ptr @a, ptr %p2, i64 0)42  store i32 %cmp0, ptr %pcmp43 44; Fold strncmp(a.a = "123", a.b = "1231", 1) to 0.45  %cmp1 = call i32 @strncmp(ptr @a, ptr %p2, i64 1)46  %pcmp1 = getelementptr i32, ptr %pcmp, i64 147  store i32 %cmp1, ptr %pcmp148 49; Fold strncmp(a.a = "123", a.b = "1231", 2) to 0.50  %cmp2 = call i32 @strncmp(ptr @a, ptr %p2, i64 2)51  %pcmp2 = getelementptr i32, ptr %pcmp, i64 252  store i32 %cmp2, ptr %pcmp253 54; Fold strncmp(a.a = "123", a.b = "1231", 3) to 0.55  %cmp3 = call i32 @strncmp(ptr @a, ptr %p2, i64 3)56  %pcmp3 = getelementptr i32, ptr %pcmp, i64 357  store i32 %cmp3, ptr %pcmp358 59; Fold strncmp(a.a = "123", a.b = "1231", 4) to 0.60; In this and the subsequent tests, reading past the end of a.a is61; strictly undefined in C/C++ (because it forms a pointer to a distinct62; subobject) but handling such cases as if they were well-defined is63; simpler than trying to exclude them.64 65  %cmp4 = call i32 @strncmp(ptr @a, ptr %p2, i64 4)66  %pcmp4 = getelementptr i32, ptr %pcmp, i64 467  store i32 %cmp4, ptr %pcmp468 69; Fold strncmp("123", "1231" "2", 5) to 0.70  %cmp5 = call i32 @strncmp(ptr @a, ptr %p2, i64 5)71  %pcmp5 = getelementptr i32, ptr %pcmp, i64 572  store i32 %cmp5, ptr %pcmp573 74; Fold strncmp("123", "1231" "23", 6) to 0.75  %cmp6 = call i32 @strncmp(ptr @a, ptr %p2, i64 6)76  %pcmp6 = getelementptr i32, ptr %pcmp, i64 677  store i32 %cmp6, ptr %pcmp678 79; Fold strncmp("123", "1231" "2345", 7) to 1.80  %cmp7 = call i32 @strncmp(ptr @a, ptr %p2, i64 7)81  %pcmp7 = getelementptr i32, ptr %pcmp, i64 782  store i32 %cmp7, ptr %pcmp783 84; Fold strncmp("123", "1231" "2345", 8) to 1.85  %cmp8 = call i32 @strncmp(ptr @a, ptr %p2, i64 8)86  %pcmp8 = getelementptr i32, ptr %pcmp, i64 887  store i32 %cmp8, ptr %pcmp888 89; Fold strncmp("123", "1231" "2345", 9) to 1.90  %cmp9 = call i32 @strncmp(ptr @a, ptr %p2, i64 9)91  %pcmp9 = getelementptr i32, ptr %pcmp, i64 992  store i32 %cmp9, ptr %pcmp993 94  ret void95}96 97 98define void @fold_strncmp_Ab_a(ptr %pcmp) {99; CHECK-LABEL: @fold_strncmp_Ab_a(100; CHECK-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 4101; CHECK-NEXT:    [[PCMP1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4102; CHECK-NEXT:    store i32 0, ptr [[PCMP1]], align 4103; CHECK-NEXT:    [[PCMP2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8104; CHECK-NEXT:    store i32 0, ptr [[PCMP2]], align 4105; CHECK-NEXT:    [[PCMP3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 12106; CHECK-NEXT:    store i32 0, ptr [[PCMP3]], align 4107; CHECK-NEXT:    [[PCMP4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16108; CHECK-NEXT:    store i32 1, ptr [[PCMP4]], align 4109; CHECK-NEXT:    [[PCMP5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 20110; CHECK-NEXT:    store i32 1, ptr [[PCMP5]], align 4111; CHECK-NEXT:    ret void112;113; p1 = &a.b[3]114  %p1 = getelementptr %struct.A, ptr @a, i32 0, i32 1, i32 3115; p2 = &a.a116 117; Fold strncmp(a.a = "123", &a.b[3] = "1" "2345", 0) to 0.118  %cmp0 = call i32 @strncmp(ptr %p1, ptr @a, i64 0)119  store i32 %cmp0, ptr %pcmp120 121; Fold strncmp(a.a = "123", &a.b[3] = "1" "2345", 1) to 0.122  %cmp1 = call i32 @strncmp(ptr %p1, ptr @a, i64 1)123  %pcmp1 = getelementptr i32, ptr %pcmp, i64 1124  store i32 %cmp1, ptr %pcmp1125 126; Fold strncmp(a.a = "123", &a.b[3] = "1" "2345", 2) to 0.127  %cmp2 = call i32 @strncmp(ptr %p1, ptr @a, i64 2)128  %pcmp2 = getelementptr i32, ptr %pcmp, i64 2129  store i32 %cmp2, ptr %pcmp2130 131; Fold strncmp(a.a = "123", &a.b[3] = "1" "2345", 3) to 0.132  %cmp3 = call i32 @strncmp(ptr %p1, ptr @a, i64 3)133  %pcmp3 = getelementptr i32, ptr %pcmp, i64 3134  store i32 %cmp3, ptr %pcmp3135 136; Fold strncmp(a.a = "123", &a.b[3] = "1" "2345", 4) to 1.137  %cmp4 = call i32 @strncmp(ptr %p1, ptr @a, i64 4)138  %pcmp4 = getelementptr i32, ptr %pcmp, i64 4139  store i32 %cmp4, ptr %pcmp4140 141; Fold strncmp(a.a = "123", &a.b[3] = "1" "2345", 5) to 1.142  %cmp5 = call i32 @strncmp(ptr %p1, ptr @a, i64 5)143  %pcmp5 = getelementptr i32, ptr %pcmp, i64 5144  store i32 %cmp5, ptr %pcmp5145 146  ret void147}148