378 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z15 | FileCheck %s3;4; Test storing of replicated values using vector replicate type instructions.5 6;; Replicated registers7 8define void @fun_2x1b(ptr %Src, ptr %Dst) {9; CHECK-LABEL: fun_2x1b:10; CHECK: # %bb.0:11; CHECK-NEXT: vlrepb %v0, 0(%r2)12; CHECK-NEXT: vsteh %v0, 0(%r3), 013; CHECK-NEXT: br %r1414 %i = load i8, ptr %Src15 %ZE = zext i8 %i to i1616 %Val = mul i16 %ZE, 25717 store i16 %Val, ptr %Dst18 ret void19}20 21; Test multiple stores of same value.22define void @fun_4x1b(ptr %Src, ptr %Dst, ptr %Dst2) {23; CHECK-LABEL: fun_4x1b:24; CHECK: # %bb.0:25; CHECK-NEXT: vlrepb %v0, 0(%r2)26; CHECK-NEXT: vstef %v0, 0(%r3), 027; CHECK-NEXT: vstef %v0, 0(%r4), 028; CHECK-NEXT: br %r1429 %i = load i8, ptr %Src30 %ZE = zext i8 %i to i3231 %Val = mul i32 %ZE, 1684300932 store i32 %Val, ptr %Dst33 store i32 %Val, ptr %Dst234 ret void35}36 37define void @fun_8x1b(ptr %Src, ptr %Dst) {38; CHECK-LABEL: fun_8x1b:39; CHECK: # %bb.0:40; CHECK-NEXT: vlrepb %v0, 0(%r2)41; CHECK-NEXT: vsteg %v0, 0(%r3), 042; CHECK-NEXT: br %r1443 %i = load i8, ptr %Src44 %ZE = zext i8 %i to i6445 %Val = mul i64 %ZE, 7234017283807667346 store i64 %Val, ptr %Dst47 ret void48}49 50; A second truncated store of same value.51define void @fun_8x1b_4x1b(ptr %Src, ptr %Dst, ptr %Dst2) {52; CHECK-LABEL: fun_8x1b_4x1b:53; CHECK: # %bb.0:54; CHECK-NEXT: vlrepb %v0, 0(%r2)55; CHECK-NEXT: vsteg %v0, 0(%r3), 056; CHECK-NEXT: vstef %v0, 0(%r4), 057; CHECK-NEXT: br %r1458 %i = load i8, ptr %Src59 %ZE = zext i8 %i to i6460 %Val = mul i64 %ZE, 7234017283807667361 store i64 %Val, ptr %Dst62 %TrVal = trunc i64 %Val to i3263 store i32 %TrVal, ptr %Dst264 ret void65}66 67define void @fun_2x2b(ptr %Src, ptr %Dst) {68; CHECK-LABEL: fun_2x2b:69; CHECK: # %bb.0:70; CHECK-NEXT: vlreph %v0, 0(%r2)71; CHECK-NEXT: vstef %v0, 0(%r3), 072; CHECK-NEXT: br %r1473 %i = load i16, ptr %Src74 %ZE = zext i16 %i to i3275 %Val = mul i32 %ZE, 6553776 store i32 %Val, ptr %Dst77 ret void78}79 80define void @fun_4x2b(ptr %Src, ptr %Dst) {81; CHECK-LABEL: fun_4x2b:82; CHECK: # %bb.0:83; CHECK-NEXT: vlreph %v0, 0(%r2)84; CHECK-NEXT: vsteg %v0, 0(%r3), 085; CHECK-NEXT: br %r1486 %i = load i16, ptr %Src87 %ZE = zext i16 %i to i6488 %Val = mul i64 %ZE, 28147927174348989 store i64 %Val, ptr %Dst90 ret void91}92 93define void @fun_2x4b(ptr %Src, ptr %Dst) {94; CHECK-LABEL: fun_2x4b:95; CHECK: # %bb.0:96; CHECK-NEXT: vlrepf %v0, 0(%r2)97; CHECK-NEXT: vsteg %v0, 0(%r3), 098; CHECK-NEXT: br %r1499 %i = load i32, ptr %Src100 %ZE = zext i32 %i to i64101 %Val = mul i64 %ZE, 4294967297102 store i64 %Val, ptr %Dst103 ret void104}105 106;; Replicated registers already in a vector.107 108; Test multiple stores of same value.109define void @fun_2Eltsx8x1b(ptr %Src, ptr %Dst, ptr %Dst2) {110; CHECK-LABEL: fun_2Eltsx8x1b:111; CHECK: # %bb.0:112; CHECK-NEXT: vlrepb %v0, 0(%r2)113; CHECK-NEXT: vst %v0, 0(%r3), 3114; CHECK-NEXT: vst %v0, 0(%r4), 3115; CHECK-NEXT: br %r14116 %i = load i8, ptr %Src117 %ZE = zext i8 %i to i64118 %Mul = mul i64 %ZE, 72340172838076673119 %tmp = insertelement <2 x i64> undef, i64 %Mul, i32 0120 %Val = shufflevector <2 x i64> %tmp, <2 x i64> undef, <2 x i32> zeroinitializer121 store <2 x i64> %Val, ptr %Dst122 store <2 x i64> %Val, ptr %Dst2123 ret void124}125 126define void @fun_4Eltsx2x2b(ptr %Src, ptr %Dst) {127; CHECK-LABEL: fun_4Eltsx2x2b:128; CHECK: # %bb.0:129; CHECK-NEXT: vlreph %v0, 0(%r2)130; CHECK-NEXT: vst %v0, 0(%r3), 3131; CHECK-NEXT: br %r14132 %i = load i16, ptr %Src133 %ZE = zext i16 %i to i32134 %Mul = mul i32 %ZE, 65537135 %tmp = insertelement <4 x i32> undef, i32 %Mul, i32 0136 %Val = shufflevector <4 x i32> %tmp, <4 x i32> undef, <4 x i32> zeroinitializer137 store <4 x i32> %Val, ptr %Dst138 ret void139}140 141define void @fun_6Eltsx2x2b(ptr %Src, ptr %Dst) {142; CHECK-LABEL: fun_6Eltsx2x2b:143; CHECK: # %bb.0:144; CHECK-NEXT: vlreph %v0, 0(%r2)145; CHECK-NEXT: vsteg %v0, 16(%r3), 0146; CHECK-NEXT: vst %v0, 0(%r3), 4147; CHECK-NEXT: br %r14148 %i = load i16, ptr %Src149 %ZE = zext i16 %i to i32150 %Mul = mul i32 %ZE, 65537151 %tmp = insertelement <6 x i32> undef, i32 %Mul, i32 0152 %Val = shufflevector <6 x i32> %tmp, <6 x i32> undef, <6 x i32> zeroinitializer153 store <6 x i32> %Val, ptr %Dst154 ret void155}156 157define void @fun_2Eltsx2x4b(ptr %Src, ptr %Dst) {158; CHECK-LABEL: fun_2Eltsx2x4b:159; CHECK: # %bb.0:160; CHECK-NEXT: vlrepf %v0, 0(%r2)161; CHECK-NEXT: vst %v0, 0(%r3), 3162; CHECK-NEXT: br %r14163 %i = load i32, ptr %Src164 %ZE = zext i32 %i to i64165 %Mul = mul i64 %ZE, 4294967297166 %tmp = insertelement <2 x i64> undef, i64 %Mul, i32 0167 %Val = shufflevector <2 x i64> %tmp, <2 x i64> undef, <2 x i32> zeroinitializer168 store <2 x i64> %Val, ptr %Dst169 ret void170}171 172define void @fun_5Eltsx2x4b(ptr %Src, ptr %Dst) {173; CHECK-LABEL: fun_5Eltsx2x4b:174; CHECK: # %bb.0:175; CHECK-NEXT: vlrepf %v0, 0(%r2)176; CHECK-NEXT: vsteg %v0, 32(%r3), 0177; CHECK-NEXT: vst %v0, 16(%r3), 4178; CHECK-NEXT: vst %v0, 0(%r3), 4179; CHECK-NEXT: br %r14180 %i = load i32, ptr %Src181 %ZE = zext i32 %i to i64182 %Mul = mul i64 %ZE, 4294967297183 %tmp = insertelement <5 x i64> undef, i64 %Mul, i32 0184 %Val = shufflevector <5 x i64> %tmp, <5 x i64> undef, <5 x i32> zeroinitializer185 store <5 x i64> %Val, ptr %Dst186 ret void187}188 189; Test replicating an incoming argument.190define void @fun_8x1b_arg(i8 %Arg, ptr %Dst) {191; CHECK-LABEL: fun_8x1b_arg:192; CHECK: # %bb.0:193; CHECK-NEXT: vlvgp %v0, %r2, %r2194; CHECK-NEXT: vrepb %v0, %v0, 7195; CHECK-NEXT: vsteg %v0, 0(%r3), 0196; CHECK-NEXT: br %r14197 %ZE = zext i8 %Arg to i64198 %Val = mul i64 %ZE, 72340172838076673199 store i64 %Val, ptr %Dst200 ret void201}202 203; A replication of a non-local value (ISD::AssertZext case).204define void @fun_nonlocalval() {205; CHECK-LABEL: fun_nonlocalval:206; CHECK: # %bb.0:207; CHECK-NEXT: lhi %r0, 0208; CHECK-NEXT: ciblh %r0, 0, 0(%r14)209; CHECK-NEXT: .LBB13_1: # %bb2210; CHECK-NEXT: llgf %r0, 0(%r1)211; CHECK-NEXT: vlvgp %v0, %r0, %r0212; CHECK-NEXT: vrepf %v0, %v0, 1213; CHECK-NEXT: vst %v0, 0(%r1), 3214; CHECK-NEXT: br %r14215 %i = load i32, ptr undef, align 4216 br i1 undef, label %bb2, label %bb7217 218bb2: ; preds = %bb1219 %i3 = zext i32 %i to i64220 %i4 = mul nuw i64 %i3, 4294967297221 %i5 = insertelement <2 x i64> poison, i64 %i4, i64 0222 %i6 = shufflevector <2 x i64> %i5, <2 x i64> poison, <2 x i32> zeroinitializer223 store <2 x i64> %i6, ptr undef, align 8224 ret void225 226bb7:227 ret void228}229 230;; Replicated immediates231 232; Some cases where scalar instruction is better233define void @fun_8x1i_zero(ptr %Dst) {234; CHECK-LABEL: fun_8x1i_zero:235; CHECK: # %bb.0:236; CHECK-NEXT: mvghi 0(%r2), 0237; CHECK-NEXT: br %r14238 store i64 0, ptr %Dst239 ret void240}241 242define void @fun_4x1i_minus1(ptr %Dst) {243; CHECK-LABEL: fun_4x1i_minus1:244; CHECK: # %bb.0:245; CHECK-NEXT: mvhi 0(%r2), -1246; CHECK-NEXT: br %r14247 store i32 -1, ptr %Dst248 ret void249}250 251define void @fun_4x1i_allones(ptr %Dst) {252; CHECK-LABEL: fun_4x1i_allones:253; CHECK: # %bb.0:254; CHECK-NEXT: mvhi 0(%r2), -1255; CHECK-NEXT: br %r14256 store i32 4294967295, ptr %Dst257 ret void258}259 260define void @fun_2i(ptr %Dst) {261; CHECK-LABEL: fun_2i:262; CHECK: # %bb.0:263; CHECK-NEXT: mvhhi 0(%r2), 1264; CHECK-NEXT: br %r14265 store i16 1, ptr %Dst266 ret void267}268 269define void @fun_2x2i(ptr %Dst) {270; CHECK-LABEL: fun_2x2i:271; CHECK: # %bb.0:272; CHECK-NEXT: vrepih %v0, 1273; CHECK-NEXT: vstef %v0, 0(%r2), 0274; CHECK-NEXT: br %r14275 store i32 65537, ptr %Dst276 ret void277}278 279define void @fun_4x2i(ptr %Dst) {280; CHECK-LABEL: fun_4x2i:281; CHECK: # %bb.0:282; CHECK-NEXT: vrepih %v0, 1283; CHECK-NEXT: vsteg %v0, 0(%r2), 0284; CHECK-NEXT: br %r14285 store i64 281479271743489, ptr %Dst286 ret void287}288 289define void @fun_2x4i(ptr %Dst) {290; CHECK-LABEL: fun_2x4i:291; CHECK: # %bb.0:292; CHECK-NEXT: vrepif %v0, 1293; CHECK-NEXT: vsteg %v0, 0(%r2), 0294; CHECK-NEXT: br %r14295 store i64 4294967297, ptr %Dst296 ret void297}298 299; Store replicated immediate twice using the same vector.300define void @fun_4x1i(ptr %Dst, ptr %Dst2) {301; CHECK-LABEL: fun_4x1i:302; CHECK: # %bb.0:303; CHECK-NEXT: vrepib %v0, 3304; CHECK-NEXT: vstef %v0, 0(%r2), 0305; CHECK-NEXT: vstef %v0, 0(%r3), 0306; CHECK-NEXT: br %r14307 store i32 50529027, ptr %Dst308 store i32 50529027, ptr %Dst2309 ret void310}311 312define void @fun_8x1i(ptr %Dst, ptr %Dst2) {313; CHECK-LABEL: fun_8x1i:314; CHECK: # %bb.0:315; CHECK-NEXT: vrepib %v0, 1316; CHECK-NEXT: vsteg %v0, 0(%r2), 0317; CHECK-NEXT: vsteg %v0, 0(%r3), 0318; CHECK-NEXT: br %r14319 store i64 72340172838076673, ptr %Dst320 store i64 72340172838076673, ptr %Dst2321 ret void322}323 324; Similar, but with vectors.325define void @fun_4Eltsx4x1i_2Eltsx4x1i(ptr %Dst, ptr %Dst2) {326; CHECK-LABEL: fun_4Eltsx4x1i_2Eltsx4x1i:327; CHECK: # %bb.0:328; CHECK-NEXT: vrepib %v0, 3329; CHECK-NEXT: vst %v0, 0(%r2), 3330; CHECK-NEXT: vsteg %v0, 0(%r3), 0331; CHECK-NEXT: br %r14332 %tmp = insertelement <4 x i32> undef, i32 50529027, i32 0333 %Val = shufflevector <4 x i32> %tmp, <4 x i32> undef, <4 x i32> zeroinitializer334 store <4 x i32> %Val, ptr %Dst335 %tmp2 = insertelement <2 x i32> undef, i32 50529027, i32 0336 %Val2 = shufflevector <2 x i32> %tmp2, <2 x i32> undef, <2 x i32> zeroinitializer337 store <2 x i32> %Val2, ptr %Dst2338 ret void339}340 341; Same, but 64-bit store is scalar.342define void @fun_4Eltsx4x1i_8x1i(ptr %Dst, ptr %Dst2) {343; CHECK-LABEL: fun_4Eltsx4x1i_8x1i:344; CHECK: # %bb.0:345; CHECK-NEXT: vrepib %v0, 3346; CHECK-NEXT: vst %v0, 0(%r2), 3347; CHECK-NEXT: vsteg %v0, 0(%r3), 0348; CHECK-NEXT: br %r14349 %tmp = insertelement <4 x i32> undef, i32 50529027, i32 0350 %Val = shufflevector <4 x i32> %tmp, <4 x i32> undef, <4 x i32> zeroinitializer351 store <4 x i32> %Val, ptr %Dst352 store i64 217020518514230019, ptr %Dst2353 ret void354}355 356define void @fun_3Eltsx2x4i(ptr %Dst) {357; CHECK-LABEL: fun_3Eltsx2x4i:358; CHECK: # %bb.0:359; CHECK-NEXT: vrepif %v0, 1360; CHECK-NEXT: vsteg %v0, 16(%r2), 0361; CHECK-NEXT: vst %v0, 0(%r2), 4362; CHECK-NEXT: br %r14363 %tmp = insertelement <3 x i64> undef, i64 4294967297, i32 0364 %Val = shufflevector <3 x i64> %tmp, <3 x i64> undef, <3 x i32> zeroinitializer365 store <3 x i64> %Val, ptr %Dst366 ret void367}368 369define void @fun_16x1i(ptr %Dst) {370; CHECK-LABEL: fun_16x1i:371; CHECK: # %bb.0:372; CHECK-NEXT: vrepib %v0, 1373; CHECK-NEXT: vst %v0, 0(%r2), 3374; CHECK-NEXT: br %r14375 store i128 1334440654591915542993625911497130241, ptr %Dst376 ret void377}378