brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.8 KiB · 9063335 Raw
637 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -mcpu=pwr9 -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK-PPC64LE3; RUN: llc -mtriple=powerpc64-unknown-linux-gnu -mcpu=pwr8 -verify-machineinstrs < %s | FileCheck %s -check-prefix=CHECK-PPC644; ptr p;5; i32 m;6; p[0] = (m >> 0) & 0xFF;7; p[1] = (m >> 8) & 0xFF;8; p[2] = (m >> 16) & 0xFF;9; p[3] = (m >> 24) & 0xFF;10define void @store_i32_by_i8(i32 signext %m, ptr %p) {11; CHECK-PPC64LE-LABEL: store_i32_by_i8:12; CHECK-PPC64LE:       # %bb.0: # %entry13; CHECK-PPC64LE-NEXT:    stw 3, 0(4)14; CHECK-PPC64LE-NEXT:    blr15;16; CHECK-PPC64-LABEL: store_i32_by_i8:17; CHECK-PPC64:       # %bb.0: # %entry18; CHECK-PPC64-NEXT:    stwbrx 3, 0, 419; CHECK-PPC64-NEXT:    blr20entry:21  %conv = trunc i32 %m to i822  store i8 %conv, ptr %p, align 123  %0 = lshr i32 %m, 824  %conv3 = trunc i32 %0 to i825  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 126  store i8 %conv3, ptr %arrayidx4, align 127  %1 = lshr i32 %m, 1628  %conv7 = trunc i32 %1 to i829  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 230  store i8 %conv7, ptr %arrayidx8, align 131  %2 = lshr i32 %m, 2432  %conv11 = trunc i32 %2 to i833  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 334  store i8 %conv11, ptr %arrayidx12, align 135  ret void36}37; ptr p;38; i32 m;39; p[0] = (m >> 24) & 0xFF;40; p[1] = (m >> 16) & 0xFF;41; p[2] = (m >> 8) & 0xFF;42; p[3] = (m >> 0) & 0xFF;43define void @store_i32_by_i8_bswap(i32 signext %m, ptr %p)  {44; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap:45; CHECK-PPC64LE:       # %bb.0: # %entry46; CHECK-PPC64LE-NEXT:    stwbrx 3, 0, 447; CHECK-PPC64LE-NEXT:    blr48;49; CHECK-PPC64-LABEL: store_i32_by_i8_bswap:50; CHECK-PPC64:       # %bb.0: # %entry51; CHECK-PPC64-NEXT:    stw 3, 0(4)52; CHECK-PPC64-NEXT:    blr53entry:54  %0 = lshr i32 %m, 2455  %conv = trunc i32 %0 to i856  store i8 %conv, ptr %p, align 157  %1 = lshr i32 %m, 1658  %conv3 = trunc i32 %1 to i859  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 160  store i8 %conv3, ptr %arrayidx4, align 161  %2 = lshr i32 %m, 862  %conv7 = trunc i32 %2 to i863  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 264  store i8 %conv7, ptr %arrayidx8, align 165  %conv11 = trunc i32 %m to i866  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 367  store i8 %conv11, ptr %arrayidx12, align 168  ret void69}70; ptr p;71; i64 m;72; p[0] = (m >> 0) & 0xFF;73; p[1] = (m >> 8) & 0xFF;74; p[2] = (m >> 16) & 0xFF;75; p[3] = (m >> 24) & 0xFF;76; p[4] = (m >> 32) & 0xFF;77; p[5] = (m >> 40) & 0xFF;78; p[6] = (m >> 48) & 0xFF;79; p[7] = (m >> 56) & 0xFF;80define void @store_i64_by_i8(i64 %m, ptr %p)  {81; CHECK-PPC64LE-LABEL: store_i64_by_i8:82; CHECK-PPC64LE:       # %bb.0: # %entry83; CHECK-PPC64LE-NEXT:    std 3, 0(4)84; CHECK-PPC64LE-NEXT:    blr85;86; CHECK-PPC64-LABEL: store_i64_by_i8:87; CHECK-PPC64:       # %bb.0: # %entry88; CHECK-PPC64-NEXT:    stdbrx 3, 0, 489; CHECK-PPC64-NEXT:    blr90entry:91  %conv = trunc i64 %m to i892  store i8 %conv, ptr %p, align 193  %0 = lshr i64 %m, 894  %conv3 = trunc i64 %0 to i895  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 196  store i8 %conv3, ptr %arrayidx4, align 197  %1 = lshr i64 %m, 1698  %conv7 = trunc i64 %1 to i899  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 2100  store i8 %conv7, ptr %arrayidx8, align 1101  %2 = lshr i64 %m, 24102  %conv11 = trunc i64 %2 to i8103  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 3104  store i8 %conv11, ptr %arrayidx12, align 1105  %3 = lshr i64 %m, 32106  %conv15 = trunc i64 %3 to i8107  %arrayidx16 = getelementptr inbounds i8, ptr %p, i64 4108  store i8 %conv15, ptr %arrayidx16, align 1109  %4 = lshr i64 %m, 40110  %conv19 = trunc i64 %4 to i8111  %arrayidx20 = getelementptr inbounds i8, ptr %p, i64 5112  store i8 %conv19, ptr %arrayidx20, align 1113  %5 = lshr i64 %m, 48114  %conv23 = trunc i64 %5 to i8115  %arrayidx24 = getelementptr inbounds i8, ptr %p, i64 6116  store i8 %conv23, ptr %arrayidx24, align 1117  %6 = lshr i64 %m, 56118  %conv27 = trunc i64 %6 to i8119  %arrayidx28 = getelementptr inbounds i8, ptr %p, i64 7120  store i8 %conv27, ptr %arrayidx28, align 1121  ret void122}123; ptr p;124; i64 m;125; p[7] = (m >> 0) & 0xFF;126; p[6] = (m >> 8) & 0xFF;127; p[5] = (m >> 16) & 0xFF;128; p[4] = (m >> 24) & 0xFF;129; p[3] = (m >> 32) & 0xFF;130; p[2] = (m >> 40) & 0xFF;131; p[1] = (m >> 48) & 0xFF;132; p[0] = (m >> 56) & 0xFF;133define void @store_i64_by_i8_bswap(i64 %m, ptr %p)  {134; CHECK-PPC64LE-LABEL: store_i64_by_i8_bswap:135; CHECK-PPC64LE:       # %bb.0: # %entry136; CHECK-PPC64LE-NEXT:    stdbrx 3, 0, 4137; CHECK-PPC64LE-NEXT:    blr138;139; CHECK-PPC64-LABEL: store_i64_by_i8_bswap:140; CHECK-PPC64:       # %bb.0: # %entry141; CHECK-PPC64-NEXT:    std 3, 0(4)142; CHECK-PPC64-NEXT:    blr143entry:144  %conv = trunc i64 %m to i8145  %arrayidx = getelementptr inbounds i8, ptr %p, i64 7146  store i8 %conv, ptr %arrayidx, align 1147  %0 = lshr i64 %m, 8148  %conv3 = trunc i64 %0 to i8149  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 6150  store i8 %conv3, ptr %arrayidx4, align 1151  %1 = lshr i64 %m, 16152  %conv7 = trunc i64 %1 to i8153  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 5154  store i8 %conv7, ptr %arrayidx8, align 1155  %2 = lshr i64 %m, 24156  %conv11 = trunc i64 %2 to i8157  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 4158  store i8 %conv11, ptr %arrayidx12, align 1159  %3 = lshr i64 %m, 32160  %conv15 = trunc i64 %3 to i8161  %arrayidx16 = getelementptr inbounds i8, ptr %p, i64 3162  store i8 %conv15, ptr %arrayidx16, align 1163  %4 = lshr i64 %m, 40164  %conv19 = trunc i64 %4 to i8165  %arrayidx20 = getelementptr inbounds i8, ptr %p, i64 2166  store i8 %conv19, ptr %arrayidx20, align 1167  %5 = lshr i64 %m, 48168  %conv23 = trunc i64 %5 to i8169  %arrayidx24 = getelementptr inbounds i8, ptr %p, i64 1170  store i8 %conv23, ptr %arrayidx24, align 1171  %6 = lshr i64 %m, 56172  %conv27 = trunc i64 %6 to i8173  store i8 %conv27, ptr %p, align 1174  ret void175}176 177; i32 t; ptr p;178; i64 m = t * 7;179; p[7] = (m >> 0) & 0xFF;180; p[6] = (m >> 8) & 0xFF;181; p[5] = (m >> 16) & 0xFF;182; p[4] = (m >> 24) & 0xFF;183; p[3] = (m >> 32) & 0xFF;184; p[2] = (m >> 40) & 0xFF;185; p[1] = (m >> 48) & 0xFF;186; p[0] = (m >> 56) & 0xFF;187define void @store_i64_by_i8_bswap_uses(i32 signext %t, ptr %p) {188; CHECK-PPC64LE-LABEL: store_i64_by_i8_bswap_uses:189; CHECK-PPC64LE:       # %bb.0: # %entry190; CHECK-PPC64LE-NEXT:    slwi 5, 3, 3191; CHECK-PPC64LE-NEXT:    sub 3, 5, 3192; CHECK-PPC64LE-NEXT:    extsw 3, 3193; CHECK-PPC64LE-NEXT:    stdbrx 3, 0, 4194; CHECK-PPC64LE-NEXT:    blr195;196; CHECK-PPC64-LABEL: store_i64_by_i8_bswap_uses:197; CHECK-PPC64:       # %bb.0: # %entry198; CHECK-PPC64-NEXT:    slwi 5, 3, 3199; CHECK-PPC64-NEXT:    sub 3, 5, 3200; CHECK-PPC64-NEXT:    extsw 3, 3201; CHECK-PPC64-NEXT:    std 3, 0(4)202; CHECK-PPC64-NEXT:    blr203entry:204  %mul = mul nsw i32 %t, 7205  %conv = sext i32 %mul to i64206  %conv1 = trunc i32 %mul to i8207  %arrayidx = getelementptr inbounds i8, ptr %p, i64 7208  store i8 %conv1, ptr %arrayidx, align 1209  %0 = lshr i64 %conv, 8210  %conv4 = trunc i64 %0 to i8211  %arrayidx5 = getelementptr inbounds i8, ptr %p, i64 6212  store i8 %conv4, ptr %arrayidx5, align 1213  %1 = lshr i64 %conv, 16214  %conv8 = trunc i64 %1 to i8215  %arrayidx9 = getelementptr inbounds i8, ptr %p, i64 5216  store i8 %conv8, ptr %arrayidx9, align 1217  %2 = lshr i64 %conv, 24218  %conv12 = trunc i64 %2 to i8219  %arrayidx13 = getelementptr inbounds i8, ptr %p, i64 4220  store i8 %conv12, ptr %arrayidx13, align 1221  %shr14 = ashr i64 %conv, 32222  %conv16 = trunc i64 %shr14 to i8223  %arrayidx17 = getelementptr inbounds i8, ptr %p, i64 3224  store i8 %conv16, ptr %arrayidx17, align 1225  %shr18 = ashr i64 %conv, 40226  %conv20 = trunc i64 %shr18 to i8227  %arrayidx21 = getelementptr inbounds i8, ptr %p, i64 2228  store i8 %conv20, ptr %arrayidx21, align 1229  %shr22 = ashr i64 %conv, 48230  %conv24 = trunc i64 %shr22 to i8231  %arrayidx25 = getelementptr inbounds i8, ptr %p, i64 1232  store i8 %conv24, ptr %arrayidx25, align 1233  %shr26 = ashr i64 %conv, 56234  %conv28 = trunc i64 %shr26 to i8235  store i8 %conv28, ptr %p, align 1236  ret void237}238 239; One of the stores is volatile240; ptr p;241; p0 = volatile *p;242; p[3] = (m >> 0) & 0xFF;243; p[2] = (m >> 8) & 0xFF;244; p[1] = (m >> 16) & 0xFF;245; *p0 = (m >> 24) & 0xFF;246define void @store_i32_by_i8_bswap_volatile(i32 signext %m, ptr %p) {247; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_volatile:248; CHECK-PPC64LE:       # %bb.0: # %entry249; CHECK-PPC64LE-NEXT:    li 5, 2250; CHECK-PPC64LE-NEXT:    sthbrx 3, 4, 5251; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16252; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24253; CHECK-PPC64LE-NEXT:    stb 5, 1(4)254; CHECK-PPC64LE-NEXT:    stb 3, 0(4)255; CHECK-PPC64LE-NEXT:    blr256;257; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_volatile:258; CHECK-PPC64:       # %bb.0: # %entry259; CHECK-PPC64-NEXT:    sth 3, 2(4)260; CHECK-PPC64-NEXT:    srwi 5, 3, 16261; CHECK-PPC64-NEXT:    srwi 3, 3, 24262; CHECK-PPC64-NEXT:    stb 5, 1(4)263; CHECK-PPC64-NEXT:    stb 3, 0(4)264; CHECK-PPC64-NEXT:    blr265entry:266  %conv = trunc i32 %m to i8267  %arrayidx = getelementptr inbounds i8, ptr %p, i64 3268  store i8 %conv, ptr %arrayidx, align 1269  %0 = lshr i32 %m, 8270  %conv3 = trunc i32 %0 to i8271  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 2272  store i8 %conv3, ptr %arrayidx4, align 1273  %1 = lshr i32 %m, 16274  %conv7 = trunc i32 %1 to i8275  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 1276  store i8 %conv7, ptr %arrayidx8, align 1277  %2 = lshr i32 %m, 24278  %conv11 = trunc i32 %2 to i8279  store volatile i8 %conv11, ptr %p, align 1280  ret void281}282 283; There is a store in between individual stores284; ptr p, q;285; p[3] = (m >> 0) & 0xFF;286; p[2] = (m >> 8) & 0xFF;287; *q = 3;288; p[1] = (m >> 16) & 0xFF;289; p[0] = (m >> 24) & 0xFF;290define void @store_i32_by_i8_bswap_store_in_between(i32 signext %m, ptr %p, ptr %q) {291; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_store_in_between:292; CHECK-PPC64LE:       # %bb.0: # %entry293; CHECK-PPC64LE-NEXT:    li 6, 2294; CHECK-PPC64LE-NEXT:    sthbrx 3, 4, 6295; CHECK-PPC64LE-NEXT:    li 6, 3296; CHECK-PPC64LE-NEXT:    stb 6, 0(5)297; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16298; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24299; CHECK-PPC64LE-NEXT:    stb 5, 1(4)300; CHECK-PPC64LE-NEXT:    stb 3, 0(4)301; CHECK-PPC64LE-NEXT:    blr302;303; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_store_in_between:304; CHECK-PPC64:       # %bb.0: # %entry305; CHECK-PPC64-NEXT:    li 6, 3306; CHECK-PPC64-NEXT:    sth 3, 2(4)307; CHECK-PPC64-NEXT:    stb 6, 0(5)308; CHECK-PPC64-NEXT:    srwi 5, 3, 16309; CHECK-PPC64-NEXT:    srwi 3, 3, 24310; CHECK-PPC64-NEXT:    stb 5, 1(4)311; CHECK-PPC64-NEXT:    stb 3, 0(4)312; CHECK-PPC64-NEXT:    blr313entry:314  %conv = trunc i32 %m to i8315  %arrayidx = getelementptr inbounds i8, ptr %p, i64 3316  store i8 %conv, ptr %arrayidx, align 1317  %0 = lshr i32 %m, 8318  %conv3 = trunc i32 %0 to i8319  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 2320  store i8 %conv3, ptr %arrayidx4, align 1321  store i8 3, ptr %q, align 1322  %1 = lshr i32 %m, 16323  %conv7 = trunc i32 %1 to i8324  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 1325  store i8 %conv7, ptr %arrayidx8, align 1326  %2 = lshr i32 %m, 24327  %conv11 = trunc i32 %2 to i8328  store i8 %conv11, ptr %p, align 1329  ret void330}331 332define void @store_i32_by_i8_bswap_unrelated_store(i32 signext %m, ptr %p, ptr %q) {333; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_unrelated_store:334; CHECK-PPC64LE:       # %bb.0: # %entry335; CHECK-PPC64LE-NEXT:    srwi 6, 3, 8336; CHECK-PPC64LE-NEXT:    stb 3, 3(4)337; CHECK-PPC64LE-NEXT:    stb 6, 2(5)338; CHECK-PPC64LE-NEXT:    srwi 5, 3, 16339; CHECK-PPC64LE-NEXT:    srwi 3, 3, 24340; CHECK-PPC64LE-NEXT:    stb 5, 1(4)341; CHECK-PPC64LE-NEXT:    stb 3, 0(4)342; CHECK-PPC64LE-NEXT:    blr343;344; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_unrelated_store:345; CHECK-PPC64:       # %bb.0: # %entry346; CHECK-PPC64-NEXT:    srwi 6, 3, 8347; CHECK-PPC64-NEXT:    stb 3, 3(4)348; CHECK-PPC64-NEXT:    stb 6, 2(5)349; CHECK-PPC64-NEXT:    srwi 5, 3, 16350; CHECK-PPC64-NEXT:    srwi 3, 3, 24351; CHECK-PPC64-NEXT:    stb 5, 1(4)352; CHECK-PPC64-NEXT:    stb 3, 0(4)353; CHECK-PPC64-NEXT:    blr354entry:355  %conv = trunc i32 %m to i8356  %arrayidx = getelementptr inbounds i8, ptr %p, i64 3357  store i8 %conv, ptr %arrayidx, align 1358  %0 = lshr i32 %m, 8359  %conv3 = trunc i32 %0 to i8360  %arrayidx4 = getelementptr inbounds i8, ptr %q, i64 2361  store i8 %conv3, ptr %arrayidx4, align 1362  %1 = lshr i32 %m, 16363  %conv7 = trunc i32 %1 to i8364  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 1365  store i8 %conv7, ptr %arrayidx8, align 1366  %2 = lshr i32 %m, 24367  %conv11 = trunc i32 %2 to i8368  store i8 %conv11, ptr %p, align 1369  ret void370}371; i32 m;372; ptr p;373; p[3] = (m >> 8) & 0xFF;374; p[4] = (m >> 0) & 0xFF;375; p[2] = (m >> 16) & 0xFF;376; p[1] = (m >> 24) & 0xFF;377define void @store_i32_by_i8_bswap_nonzero_offset(i32 signext %m, ptr %p) {378; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_nonzero_offset:379; CHECK-PPC64LE:       # %bb.0: # %entry380; CHECK-PPC64LE-NEXT:    addi 4, 4, 1381; CHECK-PPC64LE-NEXT:    stwbrx 3, 0, 4382; CHECK-PPC64LE-NEXT:    blr383;384; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_nonzero_offset:385; CHECK-PPC64:       # %bb.0: # %entry386; CHECK-PPC64-NEXT:    stw 3, 1(4)387; CHECK-PPC64-NEXT:    blr388entry:389  %0 = lshr i32 %m, 8390  %conv = trunc i32 %0 to i8391  %arrayidx = getelementptr inbounds i8, ptr %p, i64 3392  store i8 %conv, ptr %arrayidx, align 1393  %conv3 = trunc i32 %m to i8394  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 4395  store i8 %conv3, ptr %arrayidx4, align 1396  %1 = lshr i32 %m, 16397  %conv7 = trunc i32 %1 to i8398  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 2399  store i8 %conv7, ptr %arrayidx8, align 1400  %2 = lshr i32 %m, 24401  %conv11 = trunc i32 %2 to i8402  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 1403  store i8 %conv11, ptr %arrayidx12, align 1404  ret void405}406; i32 m;407; ptr p;408; p[-3] = (m >> 8) & 0xFF;409; p[-4] = (m >> 0) & 0xFF;410; p[-2] = (m >> 16) & 0xFF;411; p[-1] = (m >> 24) & 0xFF;412define void @store_i32_by_i8_neg_offset(i32 signext %m, ptr %p) {413; CHECK-PPC64LE-LABEL: store_i32_by_i8_neg_offset:414; CHECK-PPC64LE:       # %bb.0: # %entry415; CHECK-PPC64LE-NEXT:    stw 3, -4(4)416; CHECK-PPC64LE-NEXT:    blr417;418; CHECK-PPC64-LABEL: store_i32_by_i8_neg_offset:419; CHECK-PPC64:       # %bb.0: # %entry420; CHECK-PPC64-NEXT:    addi 4, 4, -4421; CHECK-PPC64-NEXT:    stwbrx 3, 0, 4422; CHECK-PPC64-NEXT:    blr423entry:424  %0 = lshr i32 %m, 8425  %conv = trunc i32 %0 to i8426  %arrayidx = getelementptr inbounds i8, ptr %p, i64 -3427  store i8 %conv, ptr %arrayidx, align 1428  %conv3 = trunc i32 %m to i8429  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 -4430  store i8 %conv3, ptr %arrayidx4, align 1431  %1 = lshr i32 %m, 16432  %conv7 = trunc i32 %1 to i8433  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 -2434  store i8 %conv7, ptr %arrayidx8, align 1435  %2 = lshr i32 %m, 24436  %conv11 = trunc i32 %2 to i8437  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 -1438  store i8 %conv11, ptr %arrayidx12, align 1439  ret void440}441; i32 m;442; ptr p;443; p[-3] = (m >> 16) & 0xFF;444; p[-4] = (m >> 24) & 0xFF;445; p[-2] = (m >> 8) & 0xFF;446; p[-1] = (m >> 0) & 0xFF;447define void @store_i32_by_i8_bswap_neg_offset(i32 signext %m, ptr %p) {448; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_neg_offset:449; CHECK-PPC64LE:       # %bb.0: # %entry450; CHECK-PPC64LE-NEXT:    addi 4, 4, -4451; CHECK-PPC64LE-NEXT:    stwbrx 3, 0, 4452; CHECK-PPC64LE-NEXT:    blr453;454; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_neg_offset:455; CHECK-PPC64:       # %bb.0: # %entry456; CHECK-PPC64-NEXT:    stw 3, -4(4)457; CHECK-PPC64-NEXT:    blr458entry:459  %0 = lshr i32 %m, 16460  %conv = trunc i32 %0 to i8461  %arrayidx = getelementptr inbounds i8, ptr %p, i64 -3462  store i8 %conv, ptr %arrayidx, align 1463  %1 = lshr i32 %m, 24464  %conv3 = trunc i32 %1 to i8465  %arrayidx4 = getelementptr inbounds i8, ptr %p, i64 -4466  store i8 %conv3, ptr %arrayidx4, align 1467  %2 = lshr i32 %m, 8468  %conv7 = trunc i32 %2 to i8469  %arrayidx8 = getelementptr inbounds i8, ptr %p, i64 -2470  store i8 %conv7, ptr %arrayidx8, align 1471  %conv11 = trunc i32 %m to i8472  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 -1473  store i8 %conv11, ptr %arrayidx12, align 1474  ret void475}476; i32 m, i;477; ptr p;478; p[i-3] = (m >> 16) & 0xFF;479; p[i-4] = (m >> 24) & 0xFF;480; p[i-2] = (m >> 8) & 0xFF;481; p[i-1] = (m >> 0) & 0xFF;482define void @store_i32_by_i8_bswap_base_index_offset(i32 %m, i32 %i, ptr %p) {483; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_base_index_offset:484; CHECK-PPC64LE:       # %bb.0: # %entry485; CHECK-PPC64LE-NEXT:    extsw 4, 4486; CHECK-PPC64LE-NEXT:    add 4, 5, 4487; CHECK-PPC64LE-NEXT:    addi 4, 4, -4488; CHECK-PPC64LE-NEXT:    stwbrx 3, 0, 4489; CHECK-PPC64LE-NEXT:    blr490;491; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_base_index_offset:492; CHECK-PPC64:       # %bb.0: # %entry493; CHECK-PPC64-NEXT:    extsw 4, 4494; CHECK-PPC64-NEXT:    add 4, 5, 4495; CHECK-PPC64-NEXT:    stw 3, -4(4)496; CHECK-PPC64-NEXT:    blr497entry:498  %0 = lshr i32 %m, 16499  %conv = trunc i32 %0 to i8500  %sub = add nsw i32 %i, -3501  %idxprom = sext i32 %sub to i64502  %arrayidx = getelementptr inbounds i8, ptr %p, i64 %idxprom503  store i8 %conv, ptr %arrayidx, align 1504  %1 = lshr i32 %m, 24505  %conv3 = trunc i32 %1 to i8506  %sub4 = add nsw i32 %i, -4507  %idxprom5 = sext i32 %sub4 to i64508  %arrayidx6 = getelementptr inbounds i8, ptr %p, i64 %idxprom5509  store i8 %conv3, ptr %arrayidx6, align 1510  %2 = lshr i32 %m, 8511  %conv9 = trunc i32 %2 to i8512  %sub10 = add nsw i32 %i, -2513  %idxprom11 = sext i32 %sub10 to i64514  %arrayidx12 = getelementptr inbounds i8, ptr %p, i64 %idxprom11515  store i8 %conv9, ptr %arrayidx12, align 1516  %conv15 = trunc i32 %m to i8517  %sub16 = add nsw i32 %i, -1518  %idxprom17 = sext i32 %sub16 to i64519  %arrayidx18 = getelementptr inbounds i8, ptr %p, i64 %idxprom17520  store i8 %conv15, ptr %arrayidx18, align 1521  ret void522}523 524; ptr p;525; i32 i, m;526; ptr p0 = p + i;527; ptr p1 = p + i + 1;528; ptr p2 = p + i + 2;529; ptr p3 = p + i + 3;530; p0[3] = (m >> 24) & 0xFF;531; p1[3] = (m >> 16) & 0xFF;532; p2[3] = (m >> 8) & 0xFF;533; p3[3] = (m >> 0) & 0xFF;534define void @store_i32_by_i8_bswap_complicated(i32 %m, i32 %i, ptr %p) {535; CHECK-PPC64LE-LABEL: store_i32_by_i8_bswap_complicated:536; CHECK-PPC64LE:       # %bb.0: # %entry537; CHECK-PPC64LE-NEXT:    extsw 4, 4538; CHECK-PPC64LE-NEXT:    add 4, 5, 4539; CHECK-PPC64LE-NEXT:    addi 4, 4, 3540; CHECK-PPC64LE-NEXT:    stwbrx 3, 0, 4541; CHECK-PPC64LE-NEXT:    blr542;543; CHECK-PPC64-LABEL: store_i32_by_i8_bswap_complicated:544; CHECK-PPC64:       # %bb.0: # %entry545; CHECK-PPC64-NEXT:    extsw 4, 4546; CHECK-PPC64-NEXT:    add 4, 5, 4547; CHECK-PPC64-NEXT:    stw 3, 3(4)548; CHECK-PPC64-NEXT:    blr549entry:550  %idx.ext = sext i32 %i to i64551  %add.ptr = getelementptr inbounds i8, ptr %p, i64 %idx.ext552  %add.ptr3 = getelementptr inbounds i8, ptr %add.ptr, i64 1553  %add.ptr6 = getelementptr inbounds i8, ptr %add.ptr, i64 2554  %add.ptr9 = getelementptr inbounds i8, ptr %add.ptr, i64 3555  %0 = lshr i32 %m, 24556  %conv = trunc i32 %0 to i8557  store i8 %conv, ptr %add.ptr9, align 1558  %1 = lshr i32 %m, 16559  %conv12 = trunc i32 %1 to i8560  %arrayidx13 = getelementptr inbounds i8, ptr %add.ptr3, i64 3561  store i8 %conv12, ptr %arrayidx13, align 1562  %2 = lshr i32 %m, 8563  %conv16 = trunc i32 %2 to i8564  %arrayidx17 = getelementptr inbounds i8, ptr %add.ptr6, i64 3565  store i8 %conv16, ptr %arrayidx17, align 1566  %conv20 = trunc i32 %m to i8567  %arrayidx21 = getelementptr inbounds i8, ptr %add.ptr9, i64 3568  store i8 %conv20, ptr %arrayidx21, align 1569  ret void570}571; ptr p; i32 m;572; p[0] = (m >> 8) & 0xFF;573; p[1] = (m >> 0) & 0xFF;574define void @store_i16_by_i8_bswap(i16 %m, ptr %p) {575; CHECK-PPC64LE-LABEL: store_i16_by_i8_bswap:576; CHECK-PPC64LE:       # %bb.0: # %entry577; CHECK-PPC64LE-NEXT:    sthbrx 3, 0, 4578; CHECK-PPC64LE-NEXT:    blr579;580; CHECK-PPC64-LABEL: store_i16_by_i8_bswap:581; CHECK-PPC64:       # %bb.0: # %entry582; CHECK-PPC64-NEXT:    sth 3, 0(4)583; CHECK-PPC64-NEXT:    blr584entry:585  %0 = lshr i16 %m, 8586  %conv1 = trunc i16 %0 to i8587  store i8 %conv1, ptr %p, align 1588  %conv5 = trunc i16 %m to i8589  %arrayidx6 = getelementptr inbounds i8, ptr %p, i64 1590  store i8 %conv5, ptr %arrayidx6, align 1591  ret void592}593; ptr p; i32 m;594; p[0] = (m >> 0) & 0xFF;595; p[1] = (m >> 8) & 0xFF;596define void @store_16_by_i8(i16 %m, ptr %p) {597; CHECK-PPC64LE-LABEL: store_16_by_i8:598; CHECK-PPC64LE:       # %bb.0: # %entry599; CHECK-PPC64LE-NEXT:    sth 3, 0(4)600; CHECK-PPC64LE-NEXT:    blr601;602; CHECK-PPC64-LABEL: store_16_by_i8:603; CHECK-PPC64:       # %bb.0: # %entry604; CHECK-PPC64-NEXT:    sthbrx 3, 0, 4605; CHECK-PPC64-NEXT:    blr606entry:607  %conv1 = trunc i16 %m to i8608  store i8 %conv1, ptr %p, align 1609  %0 = lshr i16 %m, 8610  %conv5 = trunc i16 %0 to i8611  %arrayidx6 = getelementptr inbounds i8, ptr %p, i64 1612  store i8 %conv5, ptr %arrayidx6, align 1613  ret void614}615; This was found when testing the hexxagon in testsuite616; ptr p; i8 v;617; p[0] = v;618; p[1] = v;619define void @store_same_value_to_consecutive_mem(ptr %p, i8 zeroext %v) {620; CHECK-PPC64LE-LABEL: store_same_value_to_consecutive_mem:621; CHECK-PPC64LE:       # %bb.0: # %entry622; CHECK-PPC64LE-NEXT:    stb 4, 0(3)623; CHECK-PPC64LE-NEXT:    stb 4, 1(3)624; CHECK-PPC64LE-NEXT:    blr625;626; CHECK-PPC64-LABEL: store_same_value_to_consecutive_mem:627; CHECK-PPC64:       # %bb.0: # %entry628; CHECK-PPC64-NEXT:    stb 4, 0(3)629; CHECK-PPC64-NEXT:    stb 4, 1(3)630; CHECK-PPC64-NEXT:    blr631entry:632  store i8 %v, ptr %p, align 1633  %arrayidx1 = getelementptr inbounds i8, ptr %p, i64 1634  store i8 %v, ptr %arrayidx1, align 1635  ret void636}637