brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.8 KiB · ae7c2fc Raw
166 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that calls to memcmp with arrays of elements larger than char3; are folded correctly.4; RUN: opt < %s -passes=instcombine -S -data-layout="E" | FileCheck %s --check-prefixes=BE5; RUN: opt < %s -passes=instcombine -S -data-layout="e" | FileCheck %s --check-prefixes=LE6 7declare i32 @memcmp(ptr, ptr, i64)8 9; BE representation: { 'a', 'b', 'c', ..., 'f', 'g', 'h' }10; LE representation: { 'b', 'a', 'd', ..., 'e', 'h', 'g' }11@ia16a = constant [4 x i16] [i16 24930, i16 25444, i16 25958, i16 26472]12 13; Same as the BE representation above except ending in "gg".14@i8a = constant [8 x i8] c"abcdefgg"15 16; Fold memcmp(ia16a, i8a, N) for N in [0, 8].17 18define void @fold_memcmp_ia16a_i8a(ptr %pcmp) {19; BE-LABEL: @fold_memcmp_ia16a_i8a(20; BE-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 421; BE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 422; BE-NEXT:    store i32 0, ptr [[PSTOR1]], align 423; BE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 824; BE-NEXT:    store i32 0, ptr [[PSTOR2]], align 425; BE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1226; BE-NEXT:    store i32 0, ptr [[PSTOR3]], align 427; BE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1628; BE-NEXT:    store i32 0, ptr [[PSTOR4]], align 429; BE-NEXT:    [[PSTOR5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2030; BE-NEXT:    store i32 0, ptr [[PSTOR5]], align 431; BE-NEXT:    [[PSTOR6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2432; BE-NEXT:    store i32 0, ptr [[PSTOR6]], align 433; BE-NEXT:    [[PSTOR7:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2834; BE-NEXT:    store i32 0, ptr [[PSTOR7]], align 435; BE-NEXT:    [[PSTOR8:%.*]] = getelementptr i8, ptr [[PCMP]], i64 3236; BE-NEXT:    store i32 1, ptr [[PSTOR8]], align 437; BE-NEXT:    ret void38;39; LE-LABEL: @fold_memcmp_ia16a_i8a(40; LE-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 441; LE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 442; LE-NEXT:    store i32 1, ptr [[PSTOR1]], align 443; LE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 844; LE-NEXT:    store i32 1, ptr [[PSTOR2]], align 445; LE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1246; LE-NEXT:    store i32 1, ptr [[PSTOR3]], align 447; LE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1648; LE-NEXT:    store i32 1, ptr [[PSTOR4]], align 449; LE-NEXT:    [[PSTOR5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2050; LE-NEXT:    store i32 1, ptr [[PSTOR5]], align 451; LE-NEXT:    [[PSTOR6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2452; LE-NEXT:    store i32 1, ptr [[PSTOR6]], align 453; LE-NEXT:    [[PSTOR7:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2854; LE-NEXT:    store i32 1, ptr [[PSTOR7]], align 455; LE-NEXT:    [[PSTOR8:%.*]] = getelementptr i8, ptr [[PCMP]], i64 3256; LE-NEXT:    store i32 1, ptr [[PSTOR8]], align 457; LE-NEXT:    ret void58;59 60  %cmp0 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 0)61  store i32 %cmp0, ptr %pcmp62 63  %cmp1 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 1)64  %pstor1 = getelementptr i32, ptr %pcmp, i64 165  store i32 %cmp1, ptr %pstor166 67  %cmp2 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 2)68  %pstor2 = getelementptr i32, ptr %pcmp, i64 269  store i32 %cmp2, ptr %pstor270 71  %cmp3 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 3)72  %pstor3 = getelementptr i32, ptr %pcmp, i64 373  store i32 %cmp3, ptr %pstor374 75  %cmp4 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 4)76  %pstor4 = getelementptr i32, ptr %pcmp, i64 477  store i32 %cmp4, ptr %pstor478 79  %cmp5 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 5)80  %pstor5 = getelementptr i32, ptr %pcmp, i64 581  store i32 %cmp5, ptr %pstor582 83  %cmp6 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 6)84  %pstor6 = getelementptr i32, ptr %pcmp, i64 685  store i32 %cmp6, ptr %pstor686 87  %cmp7 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 7)88  %pstor7 = getelementptr i32, ptr %pcmp, i64 789  store i32 %cmp7, ptr %pstor790 91  %cmp8 = call i32 @memcmp(ptr @ia16a, ptr @i8a, i64 8)92  %pstor8 = getelementptr i32, ptr %pcmp, i64 893  store i32 %cmp8, ptr %pstor894 95  ret void96}97 98 99; Fold memcmp(ia16a + 1, i8a + 2, N) for N in [0, 6].100 101define void @fold_memcmp_ia16a_p1_i8a_p1(ptr %pcmp) {102; BE-LABEL: @fold_memcmp_ia16a_p1_i8a_p1(103; BE-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 4104; BE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4105; BE-NEXT:    store i32 1, ptr [[PSTOR1]], align 4106; BE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8107; BE-NEXT:    store i32 1, ptr [[PSTOR2]], align 4108; BE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 12109; BE-NEXT:    store i32 1, ptr [[PSTOR3]], align 4110; BE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16111; BE-NEXT:    store i32 1, ptr [[PSTOR4]], align 4112; BE-NEXT:    [[PSTOR5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 20113; BE-NEXT:    store i32 1, ptr [[PSTOR5]], align 4114; BE-NEXT:    [[PSTOR6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24115; BE-NEXT:    store i32 1, ptr [[PSTOR6]], align 4116; BE-NEXT:    ret void117;118; LE-LABEL: @fold_memcmp_ia16a_p1_i8a_p1(119; LE-NEXT:    store i32 0, ptr [[PCMP:%.*]], align 4120; LE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4121; LE-NEXT:    store i32 1, ptr [[PSTOR1]], align 4122; LE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8123; LE-NEXT:    store i32 1, ptr [[PSTOR2]], align 4124; LE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 12125; LE-NEXT:    store i32 1, ptr [[PSTOR3]], align 4126; LE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16127; LE-NEXT:    store i32 1, ptr [[PSTOR4]], align 4128; LE-NEXT:    [[PSTOR5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 20129; LE-NEXT:    store i32 1, ptr [[PSTOR5]], align 4130; LE-NEXT:    [[PSTOR6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24131; LE-NEXT:    store i32 1, ptr [[PSTOR6]], align 4132; LE-NEXT:    ret void133;134  %p0 = getelementptr [4 x i16], ptr @ia16a, i64 0, i64 1135  %q = getelementptr [8 x i8], ptr @i8a, i64 0, i64 1136 137  %cmp0 = call i32 @memcmp(ptr %p0, ptr %q, i64 0)138  store i32 %cmp0, ptr %pcmp139 140  %cmp1 = call i32 @memcmp(ptr %p0, ptr %q, i64 1)141  %pstor1 = getelementptr i32, ptr %pcmp, i64 1142  store i32 %cmp1, ptr %pstor1143 144  %cmp2 = call i32 @memcmp(ptr %p0, ptr %q, i64 2)145  %pstor2 = getelementptr i32, ptr %pcmp, i64 2146  store i32 %cmp2, ptr %pstor2147 148  %cmp3 = call i32 @memcmp(ptr %p0, ptr %q, i64 3)149  %pstor3 = getelementptr i32, ptr %pcmp, i64 3150  store i32 %cmp3, ptr %pstor3151 152  %cmp4 = call i32 @memcmp(ptr %p0, ptr %q, i64 4)153  %pstor4 = getelementptr i32, ptr %pcmp, i64 4154  store i32 %cmp4, ptr %pstor4155 156  %cmp5 = call i32 @memcmp(ptr %p0, ptr %q, i64 5)157  %pstor5 = getelementptr i32, ptr %pcmp, i64 5158  store i32 %cmp5, ptr %pstor5159 160  %cmp6 = call i32 @memcmp(ptr %p0, ptr %q, i64 6)161  %pstor6 = getelementptr i32, ptr %pcmp, i64 6162  store i32 %cmp6, ptr %pstor6163 164  ret void165}166