brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.1 KiB · a878ece Raw
209 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that strlen calls with members of constant structs are folded.3;4; RUN: opt < %s -passes=instcombine -S | FileCheck %s5 6declare i64 @strlen(ptr)7 8%struct.A = type { [4 x i8], [5 x i8] }9 10@a = constant [2 x %struct.A] [%struct.A { [4 x i8] c"1\00\00\00", [5 x i8] c"12\00\00\00" }, %struct.A { [4 x i8] c"123\00", [5 x i8] c"1234\00" }], align 1611 12 13; Fold strlen(a[I].a + J) and strlen(a[I].b + J) with constant I and J14; to constants.15 16define void @fold_strlen_A(ptr %plen) {17; CHECK-LABEL: @fold_strlen_A(18; CHECK-NEXT:    store i64 1, ptr [[PLEN:%.*]], align 419; CHECK-NEXT:    [[PLEN1:%.*]] = getelementptr i8, ptr [[PLEN]], i64 820; CHECK-NEXT:    store i64 0, ptr [[PLEN1]], align 421; CHECK-NEXT:    [[PLEN2:%.*]] = getelementptr i8, ptr [[PLEN]], i64 1622; CHECK-NEXT:    store i64 0, ptr [[PLEN2]], align 423; CHECK-NEXT:    [[PLEN3:%.*]] = getelementptr i8, ptr [[PLEN]], i64 2424; CHECK-NEXT:    store i64 0, ptr [[PLEN3]], align 425; CHECK-NEXT:    [[PLEN4:%.*]] = getelementptr i8, ptr [[PLEN]], i64 3226; CHECK-NEXT:    store i64 2, ptr [[PLEN4]], align 427; CHECK-NEXT:    [[PLEN5:%.*]] = getelementptr i8, ptr [[PLEN]], i64 4028; CHECK-NEXT:    store i64 1, ptr [[PLEN5]], align 429; CHECK-NEXT:    [[PLEN6:%.*]] = getelementptr i8, ptr [[PLEN]], i64 4830; CHECK-NEXT:    store i64 0, ptr [[PLEN6]], align 431; CHECK-NEXT:    [[PLEN7:%.*]] = getelementptr i8, ptr [[PLEN]], i64 5632; CHECK-NEXT:    store i64 0, ptr [[PLEN7]], align 433; CHECK-NEXT:    [[PLEN8:%.*]] = getelementptr i8, ptr [[PLEN]], i64 6434; CHECK-NEXT:    store i64 0, ptr [[PLEN8]], align 435; CHECK-NEXT:    [[PLEN9:%.*]] = getelementptr i8, ptr [[PLEN]], i64 7236; CHECK-NEXT:    store i64 3, ptr [[PLEN9]], align 437; CHECK-NEXT:    [[PLEN10:%.*]] = getelementptr i8, ptr [[PLEN]], i64 8038; CHECK-NEXT:    store i64 2, ptr [[PLEN10]], align 439; CHECK-NEXT:    [[PLEN11:%.*]] = getelementptr i8, ptr [[PLEN]], i64 8840; CHECK-NEXT:    store i64 1, ptr [[PLEN11]], align 441; CHECK-NEXT:    [[PLEN12:%.*]] = getelementptr i8, ptr [[PLEN]], i64 9642; CHECK-NEXT:    store i64 0, ptr [[PLEN12]], align 443; CHECK-NEXT:    [[PLEN14:%.*]] = getelementptr i8, ptr [[PLEN]], i64 11244; CHECK-NEXT:    store i64 4, ptr [[PLEN14]], align 445; CHECK-NEXT:    [[PLEN15:%.*]] = getelementptr i8, ptr [[PLEN]], i64 12046; CHECK-NEXT:    store i64 3, ptr [[PLEN15]], align 447; CHECK-NEXT:    [[PLEN16:%.*]] = getelementptr i8, ptr [[PLEN]], i64 12848; CHECK-NEXT:    store i64 2, ptr [[PLEN16]], align 449; CHECK-NEXT:    [[PLEN17:%.*]] = getelementptr i8, ptr [[PLEN]], i64 13650; CHECK-NEXT:    store i64 1, ptr [[PLEN17]], align 451; CHECK-NEXT:    [[PLEN18:%.*]] = getelementptr i8, ptr [[PLEN]], i64 14452; CHECK-NEXT:    store i64 0, ptr [[PLEN18]], align 453; CHECK-NEXT:    ret void54;55; Fold strlen(a[0].a) to 1.56  %lena0a = call i64 @strlen(ptr @a)57  store i64 %lena0a, ptr %plen58 59; Fold strlen(a[0].a + 1) to 0.60  %pa0ap1 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 0, i64 161  %lena0ap1 = call i64 @strlen(ptr %pa0ap1)62  %plen1 = getelementptr i64, ptr %plen, i32 163  store i64 %lena0ap1, ptr %plen164 65; Fold strlen(a[0].a + 2) to 0.66  %pa0ap2 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 0, i64 267  %lena0ap2 = call i64 @strlen(ptr %pa0ap2)68  %plen2 = getelementptr i64, ptr %plen, i32 269  store i64 %lena0ap2, ptr %plen270 71; Fold strlen(a[0].a + 3) to 0.72  %pa0ap3 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 0, i64 373  %lena0ap3 = call i64 @strlen(ptr %pa0ap3)74  %plen3 = getelementptr i64, ptr %plen, i32 375  store i64 %lena0ap3, ptr %plen376 77; Fold strlen(a[0].b) to 2.78  %pa0b = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 079  %lena0b = call i64 @strlen(ptr %pa0b)80  %plen4 = getelementptr i64, ptr %plen, i32 481  store i64 %lena0b, ptr %plen482 83; Fold strlen(a[0].b + 1) to 1.84  %pa0bp1 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 185  %lena0bp1 = call i64 @strlen(ptr %pa0bp1)86  %plen5 = getelementptr i64, ptr %plen, i32 587  store i64 %lena0bp1, ptr %plen588 89; Fold strlen(a[0].b + 2) to 0.90  %pa0bp2 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 291  %lena0bp2 = call i64 @strlen(ptr %pa0bp2)92  %plen6 = getelementptr i64, ptr %plen, i32 693  store i64 %lena0bp2, ptr %plen694 95; Fold strlen(a[0].b + 3) to 0.96  %pa0bp3 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 397  %lena0bp3 = call i64 @strlen(ptr %pa0bp3)98  %plen7 = getelementptr i64, ptr %plen, i32 799  store i64 %lena0bp3, ptr %plen7100 101; Fold strlen(a[0].b + 4) to 0.102  %pa0bp4 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 4103  %lena0bp4 = call i64 @strlen(ptr %pa0bp4)104  %plen8 = getelementptr i64, ptr %plen, i32 8105  store i64 %lena0bp4, ptr %plen8106 107; Fold strlen(a[1].a) to 3.108  %pa1a = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 0, i64 0109  %lena1a = call i64 @strlen(ptr %pa1a)110  %plen9 = getelementptr i64, ptr %plen, i32 9111  store i64 %lena1a, ptr %plen9112 113; Fold strlen(a[1].a + 1) to 2.114  %pa1ap1 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 0, i64 1115  %lena1ap1 = call i64 @strlen(ptr %pa1ap1)116  %plen10 = getelementptr i64, ptr %plen, i32 10117  store i64 %lena1ap1, ptr %plen10118 119; Fold strlen(a[1].a + 2) to 1.120  %pa1ap2 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 0, i64 2121  %lena1ap2 = call i64 @strlen(ptr %pa1ap2)122  %plen11 = getelementptr i64, ptr %plen, i32 11123  store i64 %lena1ap2, ptr %plen11124 125; Fold strlen(a[1].a + 3) to 0.126  %pa1ap3 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 0, i64 3127  %lena1ap3 = call i64 @strlen(ptr %pa1ap3)128  %plen12 = getelementptr i64, ptr %plen, i32 12129  store i64 %lena1ap3, ptr %plen12130 131; Fold strlen(a[1].b) to 4.132  %pa1b = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 0133  %lena1b = call i64 @strlen(ptr %pa1b)134  %plen14 = getelementptr i64, ptr %plen, i32 14135  store i64 %lena1b, ptr %plen14136 137; Fold strlen(a[1].b + 1) to 3.138  %pa1bp1 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 1139  %lena1bp1 = call i64 @strlen(ptr %pa1bp1)140  %plen15 = getelementptr i64, ptr %plen, i32 15141  store i64 %lena1bp1, ptr %plen15142 143; Fold strlen(a[1].b + 2) to 2.144  %pa1bp2 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 2145  %lena1bp2 = call i64 @strlen(ptr %pa1bp2)146  %plen16 = getelementptr i64, ptr %plen, i32 16147  store i64 %lena1bp2, ptr %plen16148 149; Fold strlen(a[1].b + 3) to 1.150  %pa1bp3 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 3151  %lena1bp3 = call i64 @strlen(ptr %pa1bp3)152  %plen17 = getelementptr i64, ptr %plen, i32 17153  store i64 %lena1bp3, ptr %plen17154 155; Fold strlen(a[1].b + 4) to 0.156  %pa1bp4 = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 4157  %lena1bp4 = call i64 @strlen(ptr %pa1bp4)158  %plen18 = getelementptr i64, ptr %plen, i32 18159  store i64 %lena1bp4, ptr %plen18160 161  ret void162}163 164 165; TODO: Fold strlen(a[I].a + X) and strlen(a[I].b + X) with constant I and166; variable X to (X - strlen(a[I].a)) and (X - strlen(a[I].b)) respectively.167 168define void @fold_strlen_A_pI(ptr %plen, i64 %I) {169; CHECK-LABEL: @fold_strlen_A_pI(170; CHECK-NEXT:    [[PA0A:%.*]] = getelementptr [[STRUCT_A:%.*]], ptr @a, i64 0, i32 0, i64 [[I:%.*]]171; CHECK-NEXT:    [[LENA0A:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PA0A]])172; CHECK-NEXT:    store i64 [[LENA0A]], ptr [[PLEN:%.*]], align 4173; CHECK-NEXT:    [[PA0B:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @a, i64 4), i64 [[I]]174; CHECK-NEXT:    [[LENA0B:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PA0B]])175; CHECK-NEXT:    [[PLEN1:%.*]] = getelementptr i8, ptr [[PLEN]], i64 8176; CHECK-NEXT:    store i64 [[LENA0B]], ptr [[PLEN1]], align 4177; CHECK-NEXT:    [[PA1A:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @a, i64 9), i64 [[I]]178; CHECK-NEXT:    [[LENA1A:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PA1A]])179; CHECK-NEXT:    [[PLEN2:%.*]] = getelementptr i8, ptr [[PLEN]], i64 16180; CHECK-NEXT:    store i64 [[LENA1A]], ptr [[PLEN2]], align 4181; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr i8, ptr getelementptr inbounds nuw (i8, ptr @a, i64 9), i64 [[I]]182; CHECK-NEXT:    [[PA1B:%.*]] = getelementptr i8, ptr [[TMP1]], i64 4183; CHECK-NEXT:    [[LENA1B:%.*]] = call i64 @strlen(ptr noundef nonnull dereferenceable(1) [[PA1B]])184; CHECK-NEXT:    [[PLEN3:%.*]] = getelementptr i8, ptr [[PLEN]], i64 24185; CHECK-NEXT:    store i64 [[LENA1B]], ptr [[PLEN3]], align 4186; CHECK-NEXT:    ret void187;188  %pa0a = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 0, i64 %I189  %lena0a = call i64 @strlen(ptr %pa0a)190  store i64 %lena0a, ptr %plen191 192  %pa0b = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 0, i32 1, i64 %I193  %lena0b = call i64 @strlen(ptr %pa0b)194  %plen1 = getelementptr i64, ptr %plen, i32 1195  store i64 %lena0b, ptr %plen1196 197  %pa1a = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 0, i64 %I198  %lena1a = call i64 @strlen(ptr %pa1a)199  %plen2 = getelementptr i64, ptr %plen, i32 2200  store i64 %lena1a, ptr %plen2201 202  %pa1b = getelementptr [2 x %struct.A], ptr @a, i64 0, i64 1, i32 1, i64 %I203  %lena1b = call i64 @strlen(ptr %pa1b)204  %plen3 = getelementptr i64, ptr %plen, i32 3205  store i64 %lena1b, ptr %plen3206 207  ret void208}209