brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.9 KiB · 2646f8d Raw
274 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; Verify that calls to memrchr 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 ptr @memrchr(ptr, i32, i64)8 9; BE representation: { 'a', 'b', 'c', 'd', 'e', ..., 'p', 'a', 'b', 'c', 'd' }10; LE representation: { 'd', 'c', 'b', 'a', 'h', ..., 'm', 'd', 'c', 'b', 'a' }11@a = constant [5 x i32] [i32 1633837924, i32 1701209960, i32 1768581996, i32 1835954032, i32 1633837924]12 13 14; Fold memrchr(a, C, 16) for C in ['a', 'd'] U ['o', 'q'].15 16define void @fold_memrchr_a_16(ptr %pcmp) {17; BE-LABEL: @fold_memrchr_a_16(18; BE-NEXT:    store i64 0, ptr [[PCMP:%.*]], align 419; BE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 820; BE-NEXT:    store i64 1, ptr [[PSTOR1]], align 421; BE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1622; BE-NEXT:    store i64 2, ptr [[PSTOR2]], align 423; BE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2424; BE-NEXT:    store i64 3, ptr [[PSTOR3]], align 425; BE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 3226; BE-NEXT:    store i64 13, ptr [[PSTOR4]], align 427; BE-NEXT:    [[PSTOR6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4828; BE-NEXT:    store i64 14, ptr [[PSTOR6]], align 429; BE-NEXT:    [[PSTOR7:%.*]] = getelementptr i8, ptr [[PCMP]], i64 5630; BE-NEXT:    store i64 15, ptr [[PSTOR7]], align 431; BE-NEXT:    [[PSTOR8:%.*]] = getelementptr i8, ptr [[PCMP]], i64 6432; BE-NEXT:    store i64 0, ptr [[PSTOR8]], align 433; BE-NEXT:    ret void34;35; LE-LABEL: @fold_memrchr_a_16(36; LE-NEXT:    store i64 3, ptr [[PCMP:%.*]], align 437; LE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 838; LE-NEXT:    store i64 2, ptr [[PSTOR1]], align 439; LE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 1640; LE-NEXT:    store i64 1, ptr [[PSTOR2]], align 441; LE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 2442; LE-NEXT:    store i64 0, ptr [[PSTOR3]], align 443; LE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 3244; LE-NEXT:    store i64 14, ptr [[PSTOR4]], align 445; LE-NEXT:    [[PSTOR6:%.*]] = getelementptr i8, ptr [[PCMP]], i64 4846; LE-NEXT:    store i64 13, ptr [[PSTOR6]], align 447; LE-NEXT:    [[PSTOR7:%.*]] = getelementptr i8, ptr [[PCMP]], i64 5648; LE-NEXT:    store i64 12, ptr [[PSTOR7]], align 449; LE-NEXT:    [[PSTOR8:%.*]] = getelementptr i8, ptr [[PCMP]], i64 6450; LE-NEXT:    store i64 0, ptr [[PSTOR8]], align 451; LE-NEXT:    ret void52;53  %ip0 = ptrtoint ptr @a to i6454 55; Fold memrchr(a, 'a', 16) - a to 0 (3 in LE).56 57  %pa = call ptr @memrchr(ptr @a, i32 97, i64 16)58  %ipa = ptrtoint ptr %pa to i6459  %offa = sub i64 %ipa, %ip060  store i64 %offa, ptr %pcmp61 62; Fold memrchr(a, 'b', 16) - a to 1 (2 in LE)63 64  %pb = call ptr @memrchr(ptr @a, i32 98, i64 16)65  %ipb = ptrtoint ptr %pb to i6466  %offb = sub i64 %ipb, %ip067  %pstor1 = getelementptr i64, ptr %pcmp, i64 168  store i64 %offb, ptr %pstor169 70; Fold memrchr(a, 'c', 16) - a to 2 (1 in LE)71 72  %pc = call ptr @memrchr(ptr @a, i32 99, i64 16)73  %ipc = ptrtoint ptr %pc to i6474  %offc = sub i64 %ipc, %ip075  %pstor2 = getelementptr i64, ptr %pcmp, i64 276  store i64 %offc, ptr %pstor277 78; Fold memrchr(a, 'd', 16) - a to 3 (0 in LE)79 80  %pd = call ptr @memrchr(ptr @a, i32 100, i64 16)81  %ipd = ptrtoint ptr %pd to i6482  %offd = sub i64 %ipd, %ip083  %pstor3 = getelementptr i64, ptr %pcmp, i64 384  store i64 %offd, ptr %pstor385 86; Fold memrchr(a, 'n', 16) - a to 13 (14 in LE)87 88  %pn = call ptr @memrchr(ptr @a, i32 110, i64 16)89  %ipn = ptrtoint ptr %pn to i6490  %offn = sub i64 %ipn, %ip091  %pstor4 = getelementptr i64, ptr %pcmp, i64 492  store i64 %offn, ptr %pstor493 94; Fold memrchr(a, 'o', 16) - a to 14 (13 in LE)95 96  %po = call ptr @memrchr(ptr @a, i32 111, i64 16)97  %ipo = ptrtoint ptr %po to i6498  %offo = sub i64 %ipo, %ip099  %pstor6 = getelementptr i64, ptr %pcmp, i64 6100  store i64 %offo, ptr %pstor6101 102; Fold memrchr(a, 'p', 16) - a to 15 (12 in LE)103 104  %pp = call ptr @memrchr(ptr @a, i32 112, i64 16)105  %ipp = ptrtoint ptr %pp to i64106  %offp = sub i64 %ipp, %ip0107  %pstor7 = getelementptr i64, ptr %pcmp, i64 7108  store i64 %offp, ptr %pstor7109 110; Fold memrchr(a, 'q', 16) to null in both BE and LE.111 112  %pq = call ptr @memrchr(ptr @a, i32 113, i64 16)113  %ipq = ptrtoint ptr %pq to i64114  %pstor8 = getelementptr i64, ptr %pcmp, i64 8115  store i64 %ipq, ptr %pstor8116 117  ret void118}119 120 121; Fold memrchr(a + 1, C, 12) for C in ['e', 'h'] U ['a', 'd'].122 123define void @fold_memrchr_a_p1_16(ptr %pcmp) {124; BE-LABEL: @fold_memrchr_a_p1_16(125; BE-NEXT:    store i64 0, ptr [[PCMP:%.*]], align 4126; BE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8127; BE-NEXT:    store i64 1, ptr [[PSTOR1]], align 4128; BE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16129; BE-NEXT:    store i64 2, ptr [[PSTOR2]], align 4130; BE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24131; BE-NEXT:    store i64 3, ptr [[PSTOR3]], align 4132; BE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 32133; BE-NEXT:    store i64 0, ptr [[PSTOR4]], align 4134; BE-NEXT:    [[PSTOR5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 40135; BE-NEXT:    store i64 0, ptr [[PSTOR5]], align 4136; BE-NEXT:    ret void137;138; LE-LABEL: @fold_memrchr_a_p1_16(139; LE-NEXT:    store i64 3, ptr [[PCMP:%.*]], align 4140; LE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8141; LE-NEXT:    store i64 2, ptr [[PSTOR1]], align 4142; LE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16143; LE-NEXT:    store i64 1, ptr [[PSTOR2]], align 4144; LE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24145; LE-NEXT:    store i64 0, ptr [[PSTOR3]], align 4146; LE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 32147; LE-NEXT:    store i64 0, ptr [[PSTOR4]], align 4148; LE-NEXT:    [[PSTOR5:%.*]] = getelementptr i8, ptr [[PCMP]], i64 40149; LE-NEXT:    store i64 0, ptr [[PSTOR5]], align 4150; LE-NEXT:    ret void151;152  %p0 = getelementptr [5 x i32], ptr @a, i64 0, i64 1153  %ip0 = ptrtoint ptr %p0 to i64154 155; Fold memrchr(a + 1, 'e', 12) - a to 0 (3 in LE).156 157  %pe = call ptr @memrchr(ptr %p0, i32 101, i64 12)158  %ipe = ptrtoint ptr %pe to i64159  %offe = sub i64 %ipe, %ip0160  store i64 %offe, ptr %pcmp161 162; Fold memrchr(a + 1, 'f', 12) - a to 1 (2 in LE).163 164  %pf = call ptr @memrchr(ptr %p0, i32 102, i64 12)165  %ipf = ptrtoint ptr %pf to i64166  %offf = sub i64 %ipf, %ip0167  %pstor1 = getelementptr i64, ptr %pcmp, i64 1168  store i64 %offf, ptr %pstor1169 170; Fold memrchr(a + 1, 'g', 12) - a to 2 (1 in LE).171 172  %pg = call ptr @memrchr(ptr %p0, i32 103, i64 12)173  %ipg = ptrtoint ptr %pg to i64174  %offg = sub i64 %ipg, %ip0175  %pstor2 = getelementptr i64, ptr %pcmp, i64 2176  store i64 %offg, ptr %pstor2177 178; Fold memrchr(a + 1, 'h', 12) - a to 3 (0 in LE).179 180  %ph = call ptr @memrchr(ptr %p0, i32 104, i64 12)181  %iph = ptrtoint ptr %ph to i64182  %offh = sub i64 %iph, %ip0183  %pstor3 = getelementptr i64, ptr %pcmp, i64 3184  store i64 %offh, ptr %pstor3185 186; Fold memrchr(a + 1, 'a', 12) to null in both BE and LE.187 188  %pa = call ptr @memrchr(ptr %p0, i32 97, i64 12)189  %ipa = ptrtoint ptr %pa to i64190  %pstor4 = getelementptr i64, ptr %pcmp, i64 4191  store i64 %ipa, ptr %pstor4192 193; Fold memrchr(a + 1, 'd', 12) to null in both BE and LE.194 195  %pd = call ptr @memrchr(ptr %p0, i32 100, i64 12)196  %ipd = ptrtoint ptr %pd to i64197  %pstor5 = getelementptr i64, ptr %pcmp, i64 5198  store i64 %ipd, ptr %pstor5199 200  ret void201}202 203 204; Fold memrchr(a, C, 20) for C in ['a', 'e'].205 206define void @fold_memrchr_a_20(ptr %pcmp) {207; BE-LABEL: @fold_memrchr_a_20(208; BE-NEXT:    store i64 16, ptr [[PCMP:%.*]], align 4209; BE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8210; BE-NEXT:    store i64 17, ptr [[PSTOR1]], align 4211; BE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16212; BE-NEXT:    store i64 18, ptr [[PSTOR2]], align 4213; BE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24214; BE-NEXT:    store i64 19, ptr [[PSTOR3]], align 4215; BE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 32216; BE-NEXT:    store i64 4, ptr [[PSTOR4]], align 4217; BE-NEXT:    ret void218;219; LE-LABEL: @fold_memrchr_a_20(220; LE-NEXT:    store i64 19, ptr [[PCMP:%.*]], align 4221; LE-NEXT:    [[PSTOR1:%.*]] = getelementptr i8, ptr [[PCMP]], i64 8222; LE-NEXT:    store i64 18, ptr [[PSTOR1]], align 4223; LE-NEXT:    [[PSTOR2:%.*]] = getelementptr i8, ptr [[PCMP]], i64 16224; LE-NEXT:    store i64 17, ptr [[PSTOR2]], align 4225; LE-NEXT:    [[PSTOR3:%.*]] = getelementptr i8, ptr [[PCMP]], i64 24226; LE-NEXT:    store i64 16, ptr [[PSTOR3]], align 4227; LE-NEXT:    [[PSTOR4:%.*]] = getelementptr i8, ptr [[PCMP]], i64 32228; LE-NEXT:    store i64 7, ptr [[PSTOR4]], align 4229; LE-NEXT:    ret void230;231  %ip0 = ptrtoint ptr @a to i64232 233; Fold memrchr(a, 'a', 20) - a to 16 (19 in LE).234 235  %pa = call ptr @memrchr(ptr @a, i32 97, i64 20)236  %ipa = ptrtoint ptr %pa to i64237  %offa = sub i64 %ipa, %ip0238  store i64 %offa, ptr %pcmp239 240; Fold memrchr(a, 'b', 16) - a to 17 (18 in LE)241 242  %pb = call ptr @memrchr(ptr @a, i32 98, i64 20)243  %ipb = ptrtoint ptr %pb to i64244  %offb = sub i64 %ipb, %ip0245  %pstor1 = getelementptr i64, ptr %pcmp, i64 1246  store i64 %offb, ptr %pstor1247 248; Fold memrchr(a, 'c', 16) - a to 18 (17 in LE)249 250  %pc = call ptr @memrchr(ptr @a, i32 99, i64 20)251  %ipc = ptrtoint ptr %pc to i64252  %offc = sub i64 %ipc, %ip0253  %pstor2 = getelementptr i64, ptr %pcmp, i64 2254  store i64 %offc, ptr %pstor2255 256; Fold memrchr(a, 'd', 16) - a to 19 (16 in LE)257 258  %pd = call ptr @memrchr(ptr @a, i32 100, i64 20)259  %ipd = ptrtoint ptr %pd to i64260  %offd = sub i64 %ipd, %ip0261  %pstor3 = getelementptr i64, ptr %pcmp, i64 3262  store i64 %offd, ptr %pstor3263 264; Fold memrchr(a, 'e', 16) - a to 4 (7 in LE)265 266  %pe = call ptr @memrchr(ptr @a, i32 101, i64 20)267  %ipe = ptrtoint ptr %pe to i64268  %offe = sub i64 %ipe, %ip0269  %pstor4 = getelementptr i64, ptr %pcmp, i64 4270  store i64 %offe, ptr %pstor4271 272  ret void273}274