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