brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.3 KiB · 6caca2c Raw
93 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that calls to snprintf with members of constant structs as arguments3; are folded to constants as expected.4; RUN: opt < %s -passes=instcombine -S | FileCheck %s5 6declare i32 @snprintf(ptr, i64, ptr, ...)7 8%struct.A = type { [5 x i8], [6 x i8], [7 x i8] }9 10@a = constant [2 x %struct.A] [%struct.A { [5 x i8] c"1\00\00\00\00", [6 x i8] c"12\00\00\00\00", [7 x i8] c"123\00\00\00\00" }, %struct.A { [5 x i8] c"1234\00", [6 x i8] c"12345\00", [7 x i8] c"123456\00" }]11 12@pcnt_s = constant [3 x i8] c"%s\00"13 14 15; Fold snprintf(0, 0, "%s", a[I].M + C) for constant I in [0, 1],16; member M in [a, b, c], and C in a valid range to a constant.17 18define void @fold_snprintf_member_pC(ptr %pi) {19; CHECK-LABEL: @fold_snprintf_member_pC(20; CHECK-NEXT:    store i32 1, ptr [[PI:%.*]], align 421; CHECK-NEXT:    [[PIA0AP1:%.*]] = getelementptr i8, ptr [[PI]], i64 422; CHECK-NEXT:    store i32 0, ptr [[PIA0AP1]], align 423; CHECK-NEXT:    [[PIA0B:%.*]] = getelementptr i8, ptr [[PI]], i64 824; CHECK-NEXT:    store i32 2, ptr [[PIA0B]], align 425; CHECK-NEXT:    [[PIA0BP1:%.*]] = getelementptr i8, ptr [[PI]], i64 1226; CHECK-NEXT:    store i32 1, ptr [[PIA0BP1]], align 427; CHECK-NEXT:    [[PIA0BP2:%.*]] = getelementptr i8, ptr [[PI]], i64 1628; CHECK-NEXT:    store i32 0, ptr [[PIA0BP2]], align 429; CHECK-NEXT:    [[PIA0C:%.*]] = getelementptr i8, ptr [[PI]], i64 2030; CHECK-NEXT:    store i32 3, ptr [[PIA0C]], align 431; CHECK-NEXT:    [[PIA1A:%.*]] = getelementptr i8, ptr [[PI]], i64 2432; CHECK-NEXT:    store i32 4, ptr [[PIA1A]], align 433; CHECK-NEXT:    [[PIA1B:%.*]] = getelementptr i8, ptr [[PI]], i64 2834; CHECK-NEXT:    store i32 5, ptr [[PIA1B]], align 435; CHECK-NEXT:    [[PIA1C:%.*]] = getelementptr i8, ptr [[PI]], i64 3236; CHECK-NEXT:    store i32 6, ptr [[PIA1C]], align 437; CHECK-NEXT:    ret void38;39; Fold snprintf(0, 0, "%s", a[0].a) to 1.40  %ia0a = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr @a)41  store i32 %ia0a, ptr %pi42 43; Fold snprintf(0, 0, "%s", a[0].a) to 0.44  %pa0ap1 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 0, i64 145  %ia0ap1 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa0ap1)46  %pia0ap1 = getelementptr i32, ptr %pi, i32 147  store i32 %ia0ap1, ptr %pia0ap148 49; Fold snprintf(0, 0, "%s", a[0].b) to 2.50  %pa0b = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 051  %ia0b = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa0b)52  %pia0b = getelementptr i32, ptr %pi, i32 253  store i32 %ia0b, ptr %pia0b54 55; Fold snprintf(0, 0, "%s", a[0].b + 1) to 1.56  %pa0bp1 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 157  %ia0bp1 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa0bp1)58  %pia0bp1 = getelementptr i32, ptr %pi, i32 359  store i32 %ia0bp1, ptr %pia0bp160 61; Fold snprintf(0, 0, "%s", a[0].b + 2) to 0.62  %pa0bp2 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 263  %ia0bp2 = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa0bp2)64  %pia0bp2 = getelementptr i32, ptr %pi, i32 465  store i32 %ia0bp2, ptr %pia0bp266 67; Fold snprintf(0, 0, "%s", a[0].c) to 3.68  %pa0c = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 2, i64 069  %ia0c = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa0c)70  %pia0c = getelementptr i32, ptr %pi, i32 571  store i32 %ia0c, ptr %pia0c72 73; Fold snprintf(0, 0, "%s", a[1].a) to 4.74  %pa1a = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 0, i64 075  %ia1a = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa1a)76  %pia1a = getelementptr i32, ptr %pi, i32 677  store i32 %ia1a, ptr %pia1a78 79; Fold snprintf(0, 0, "%s", a[1].b) to 5.80  %pa1b = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 081  %ia1b = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa1b)82  %pia1b = getelementptr i32, ptr %pi, i32 783  store i32 %ia1b, ptr %pia1b84 85; Fold snprintf(0, 0, "%s", a[1].c) to 6.86  %pa1c = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 2, i64 087  %ia1c = call i32 (ptr, i64, ptr, ...) @snprintf(ptr null, i64 0, ptr @pcnt_s, ptr %pa1c)88  %pia1c = getelementptr i32, ptr %pi, i32 889  store i32 %ia1c, ptr %pia1c90 91  ret void92}93