brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.6 KiB · 2877527 Raw
302 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+zvl256b | FileCheck %s3 4; Test binary operator with vp.merge and vp.smax.5define <8 x i32> @vpmerge_vpadd(<8 x i32> %passthru, <8 x i32> %x, <8 x i32> %y, <8 x i1> %m, i32 zeroext %vl) {6; CHECK-LABEL: vpmerge_vpadd:7; CHECK:       # %bb.0:8; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu9; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t10; CHECK-NEXT:    ret11  %a = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i1> splat (i1 true), i32 %vl)12  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)13  ret <8 x i32> %b14}15 16; Test glued node of merge should not be deleted.17define <8 x i32> @vpmerge_vpadd2(<8 x i32> %passthru, <8 x i32> %x, <8 x i32> %y, i32 zeroext %vl) {18; CHECK-LABEL: vpmerge_vpadd2:19; CHECK:       # %bb.0:20; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma21; CHECK-NEXT:    vmseq.vv v0, v9, v1022; CHECK-NEXT:    vsetvli zero, zero, e32, m1, tu, mu23; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t24; CHECK-NEXT:    ret25  %a = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i1> splat (i1 true), i32 %vl)26  %m = call <8 x i1> @llvm.vp.icmp.v8i32(<8 x i32> %x, <8 x i32> %y, metadata !"eq", <8 x i1> splat (i1 true), i32 %vl)27  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)28  ret <8 x i32> %b29}30 31; Test vp.merge have all-ones mask.32define <8 x i32> @vpmerge_vpadd3(<8 x i32> %passthru, <8 x i32> %x, <8 x i32> %y, i32 zeroext %vl) {33; CHECK-LABEL: vpmerge_vpadd3:34; CHECK:       # %bb.0:35; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, ma36; CHECK-NEXT:    vadd.vv v8, v9, v1037; CHECK-NEXT:    ret38  %a = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i1> splat (i1 true), i32 %vl)39  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> splat (i1 true), <8 x i32> %a, <8 x i32> %passthru, i32 %vl)40  ret <8 x i32> %b41}42 43; Test float binary operator with vp.merge and vp.fadd.44define <8 x float> @vpmerge_vpfadd(<8 x float> %passthru, <8 x float> %x, <8 x float> %y, <8 x i1> %m, i32 zeroext %vl) {45; CHECK-LABEL: vpmerge_vpfadd:46; CHECK:       # %bb.0:47; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu48; CHECK-NEXT:    vfadd.vv v8, v9, v10, v0.t49; CHECK-NEXT:    ret50  %a = call <8 x float> @llvm.vp.fadd.v8f32(<8 x float> %x, <8 x float> %y, <8 x i1> splat (i1 true), i32 %vl)51  %b = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %a, <8 x float> %passthru, i32 %vl)52  ret <8 x float> %b53}54 55; Test conversion by fptosi.56define <8 x i16> @vpmerge_vpfptosi(<8 x i16> %passthru, <8 x float> %x, <8 x i1> %m, i32 zeroext %vl) {57; CHECK-LABEL: vpmerge_vpfptosi:58; CHECK:       # %bb.0:59; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, tu, mu60; CHECK-NEXT:    vfncvt.rtz.x.f.w v8, v9, v0.t61; CHECK-NEXT:    ret62  %a = call <8 x i16> @llvm.vp.fptosi.v8i16.v8f32(<8 x float> %x, <8 x i1> splat (i1 true), i32 %vl)63  %b = call <8 x i16> @llvm.vp.merge.v8i16(<8 x i1> %m, <8 x i16> %a, <8 x i16> %passthru, i32 %vl)64  ret <8 x i16> %b65}66 67; Test conversion by sitofp.68define <8 x float> @vpmerge_vpsitofp(<8 x float> %passthru, <8 x i64> %x, <8 x i1> %m, i32 zeroext %vl) {69; CHECK-LABEL: vpmerge_vpsitofp:70; CHECK:       # %bb.0:71; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu72; CHECK-NEXT:    vfncvt.f.x.w v8, v10, v0.t73; CHECK-NEXT:    ret74  %a = call <8 x float> @llvm.vp.sitofp.v8f32.v8i64(<8 x i64> %x, <8 x i1> splat (i1 true), i32 %vl)75  %b = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %a, <8 x float> %passthru, i32 %vl)76  ret <8 x float> %b77}78 79; Test integer extension by vp.zext.80define <8 x i32> @vpmerge_vpzext(<8 x i32> %passthru, <8 x i8> %x, <8 x i1> %m, i32 zeroext %vl) {81; CHECK-LABEL: vpmerge_vpzext:82; CHECK:       # %bb.0:83; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu84; CHECK-NEXT:    vzext.vf4 v8, v9, v0.t85; CHECK-NEXT:    ret86  %a = call <8 x i32> @llvm.vp.zext.v8i32.v8i8(<8 x i8> %x, <8 x i1> splat (i1 true), i32 %vl)87  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)88  ret <8 x i32> %b89}90 91; Test integer truncation by vp.trunc.92define <8 x i32> @vpmerge_vptrunc(<8 x i32> %passthru, <8 x i64> %x, <8 x i1> %m, i32 zeroext %vl) {93; CHECK-LABEL: vpmerge_vptrunc:94; CHECK:       # %bb.0:95; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu96; CHECK-NEXT:    vnsrl.wi v8, v10, 0, v0.t97; CHECK-NEXT:    ret98  %a = call <8 x i32> @llvm.vp.trunc.v8i32.v8i64(<8 x i64> %x, <8 x i1> splat (i1 true), i32 %vl)99  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)100  ret <8 x i32> %b101}102 103; Test integer extension by vp.fpext.104define <8 x double> @vpmerge_vpfpext(<8 x double> %passthru, <8 x float> %x, <8 x i1> %m, i32 zeroext %vl) {105; CHECK-LABEL: vpmerge_vpfpext:106; CHECK:       # %bb.0:107; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu108; CHECK-NEXT:    vfwcvt.f.f.v v8, v10, v0.t109; CHECK-NEXT:    ret110  %a = call <8 x double> @llvm.vp.fpext.v8f64.v8f32(<8 x float> %x, <8 x i1> splat (i1 true), i32 %vl)111  %b = call <8 x double> @llvm.vp.merge.v8f64(<8 x i1> %m, <8 x double> %a, <8 x double> %passthru, i32 %vl)112  ret <8 x double> %b113}114 115; Test integer truncation by vp.trunc.116define <8 x float> @vpmerge_vpfptrunc(<8 x float> %passthru, <8 x double> %x, <8 x i1> %m, i32 zeroext %vl) {117; CHECK-LABEL: vpmerge_vpfptrunc:118; CHECK:       # %bb.0:119; CHECK-NEXT:    vsetvli zero, a0, e32, m1, tu, mu120; CHECK-NEXT:    vfncvt.f.f.w v8, v10, v0.t121; CHECK-NEXT:    ret122  %a = call <8 x float> @llvm.vp.fptrunc.v8f32.v8f64(<8 x double> %x, <8 x i1> splat (i1 true), i32 %vl)123  %b = call <8 x float> @llvm.vp.merge.v8f32(<8 x i1> %m, <8 x float> %a, <8 x float> %passthru, i32 %vl)124  ret <8 x float> %b125}126 127; Test load operation by vp.load.128 129define <8 x i32> @vpmerge_vpload(<8 x i32> %passthru, ptr %p, <8 x i1> %m, i32 zeroext %vl) {130; CHECK-LABEL: vpmerge_vpload:131; CHECK:       # %bb.0:132; CHECK-NEXT:    vsetvli zero, a1, e32, m1, tu, mu133; CHECK-NEXT:    vle32.v v8, (a0), v0.t134; CHECK-NEXT:    ret135  %a = call <8 x i32> @llvm.vp.load.v8i32.p0(ptr %p, <8 x i1> splat (i1 true), i32 %vl)136  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)137  ret <8 x i32> %b138}139 140; Test result have chain and glued node.141define <8 x i32> @vpmerge_vpload2(<8 x i32> %passthru, ptr %p, <8 x i32> %x, <8 x i32> %y, i32 zeroext %vl) {142; CHECK-LABEL: vpmerge_vpload2:143; CHECK:       # %bb.0:144; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, ma145; CHECK-NEXT:    vmseq.vv v0, v9, v10146; CHECK-NEXT:    vsetvli zero, zero, e32, m1, tu, mu147; CHECK-NEXT:    vle32.v v8, (a0), v0.t148; CHECK-NEXT:    ret149  %a = call <8 x i32> @llvm.vp.load.v8i32.p0(ptr %p, <8 x i1> splat (i1 true), i32 %vl)150  %m = call <8 x i1> @llvm.vp.icmp.v8i32(<8 x i32> %x, <8 x i32> %y, metadata !"eq", <8 x i1> splat (i1 true), i32 %vl)151  %b = call <8 x i32> @llvm.vp.merge.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)152  ret <8 x i32> %b153}154 155; Test binary operator with vp.select and vp.add.156define <8 x i32> @vpselect_vpadd(<8 x i32> %passthru, <8 x i32> %x, <8 x i32> %y, <8 x i1> %m, i32 zeroext %vl) {157; CHECK-LABEL: vpselect_vpadd:158; CHECK:       # %bb.0:159; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu160; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t161; CHECK-NEXT:    ret162  %a = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i1> splat (i1 true), i32 %vl)163  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)164  ret <8 x i32> %b165}166 167; Test glued node of select should not be deleted.168define <8 x i32> @vpselect_vpadd2(<8 x i32> %passthru, <8 x i32> %x, <8 x i32> %y, i32 zeroext %vl) {169; CHECK-LABEL: vpselect_vpadd2:170; CHECK:       # %bb.0:171; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu172; CHECK-NEXT:    vmseq.vv v0, v9, v10173; CHECK-NEXT:    vadd.vv v8, v9, v10, v0.t174; CHECK-NEXT:    ret175  %a = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i1> splat (i1 true), i32 %vl)176  %m = call <8 x i1> @llvm.vp.icmp.v8i32(<8 x i32> %x, <8 x i32> %y, metadata !"eq", <8 x i1> splat (i1 true), i32 %vl)177  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)178  ret <8 x i32> %b179}180 181; Test vp.select have all-ones mask.182define <8 x i32> @vpselect_vpadd3(<8 x i32> %passthru, <8 x i32> %x, <8 x i32> %y, i32 zeroext %vl) {183; CHECK-LABEL: vpselect_vpadd3:184; CHECK:       # %bb.0:185; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, ma186; CHECK-NEXT:    vadd.vv v8, v9, v10187; CHECK-NEXT:    ret188  %a = call <8 x i32> @llvm.vp.add.v8i32(<8 x i32> %x, <8 x i32> %y, <8 x i1> splat (i1 true), i32 %vl)189  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> splat (i1 true), <8 x i32> %a, <8 x i32> %passthru, i32 %vl)190  ret <8 x i32> %b191}192 193; Test float binary operator with vp.select and vp.fadd.194define <8 x float> @vpselect_vpfadd(<8 x float> %passthru, <8 x float> %x, <8 x float> %y, <8 x i1> %m, i32 zeroext %vl) {195; CHECK-LABEL: vpselect_vpfadd:196; CHECK:       # %bb.0:197; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu198; CHECK-NEXT:    vfadd.vv v8, v9, v10, v0.t199; CHECK-NEXT:    ret200  %a = call <8 x float> @llvm.vp.fadd.v8f32(<8 x float> %x, <8 x float> %y, <8 x i1> splat (i1 true), i32 %vl)201  %b = call <8 x float> @llvm.vp.select.v8f32(<8 x i1> %m, <8 x float> %a, <8 x float> %passthru, i32 %vl)202  ret <8 x float> %b203}204 205; Test conversion by fptosi.206define <8 x i16> @vpselect_vpfptosi(<8 x i16> %passthru, <8 x float> %x, <8 x i1> %m, i32 zeroext %vl) {207; CHECK-LABEL: vpselect_vpfptosi:208; CHECK:       # %bb.0:209; CHECK-NEXT:    vsetvli zero, a0, e16, mf2, ta, mu210; CHECK-NEXT:    vfncvt.rtz.x.f.w v8, v9, v0.t211; CHECK-NEXT:    ret212  %a = call <8 x i16> @llvm.vp.fptosi.v8i16.v8f32(<8 x float> %x, <8 x i1> splat (i1 true), i32 %vl)213  %b = call <8 x i16> @llvm.vp.select.v8i16(<8 x i1> %m, <8 x i16> %a, <8 x i16> %passthru, i32 %vl)214  ret <8 x i16> %b215}216 217; Test conversion by sitofp.218define <8 x float> @vpselect_vpsitofp(<8 x float> %passthru, <8 x i64> %x, <8 x i1> %m, i32 zeroext %vl) {219; CHECK-LABEL: vpselect_vpsitofp:220; CHECK:       # %bb.0:221; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu222; CHECK-NEXT:    vfncvt.f.x.w v8, v10, v0.t223; CHECK-NEXT:    ret224  %a = call <8 x float> @llvm.vp.sitofp.v8f32.v8i64(<8 x i64> %x, <8 x i1> splat (i1 true), i32 %vl)225  %b = call <8 x float> @llvm.vp.select.v8f32(<8 x i1> %m, <8 x float> %a, <8 x float> %passthru, i32 %vl)226  ret <8 x float> %b227}228 229; Test integer extension by vp.zext.230define <8 x i32> @vpselect_vpzext(<8 x i32> %passthru, <8 x i8> %x, <8 x i1> %m, i32 zeroext %vl) {231; CHECK-LABEL: vpselect_vpzext:232; CHECK:       # %bb.0:233; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu234; CHECK-NEXT:    vzext.vf4 v8, v9, v0.t235; CHECK-NEXT:    ret236  %a = call <8 x i32> @llvm.vp.zext.v8i32.v8i8(<8 x i8> %x, <8 x i1> splat (i1 true), i32 %vl)237  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)238  ret <8 x i32> %b239}240 241; Test integer truncation by vp.trunc.242define <8 x i32> @vpselect_vptrunc(<8 x i32> %passthru, <8 x i64> %x, <8 x i1> %m, i32 zeroext %vl) {243; CHECK-LABEL: vpselect_vptrunc:244; CHECK:       # %bb.0:245; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu246; CHECK-NEXT:    vnsrl.wi v8, v10, 0, v0.t247; CHECK-NEXT:    ret248  %a = call <8 x i32> @llvm.vp.trunc.v8i32.v8i64(<8 x i64> %x, <8 x i1> splat (i1 true), i32 %vl)249  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)250  ret <8 x i32> %b251}252 253; Test integer extension by vp.fpext.254define <8 x double> @vpselect_vpfpext(<8 x double> %passthru, <8 x float> %x, <8 x i1> %m, i32 zeroext %vl) {255; CHECK-LABEL: vpselect_vpfpext:256; CHECK:       # %bb.0:257; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu258; CHECK-NEXT:    vfwcvt.f.f.v v8, v10, v0.t259; CHECK-NEXT:    ret260  %a = call <8 x double> @llvm.vp.fpext.v8f64.v8f32(<8 x float> %x, <8 x i1> splat (i1 true), i32 %vl)261  %b = call <8 x double> @llvm.vp.select.v8f64(<8 x i1> %m, <8 x double> %a, <8 x double> %passthru, i32 %vl)262  ret <8 x double> %b263}264 265; Test integer truncation by vp.trunc.266define <8 x float> @vpselect_vpfptrunc(<8 x float> %passthru, <8 x double> %x, <8 x i1> %m, i32 zeroext %vl) {267; CHECK-LABEL: vpselect_vpfptrunc:268; CHECK:       # %bb.0:269; CHECK-NEXT:    vsetvli zero, a0, e32, m1, ta, mu270; CHECK-NEXT:    vfncvt.f.f.w v8, v10, v0.t271; CHECK-NEXT:    ret272  %a = call <8 x float> @llvm.vp.fptrunc.v8f32.v8f64(<8 x double> %x, <8 x i1> splat (i1 true), i32 %vl)273  %b = call <8 x float> @llvm.vp.select.v8f32(<8 x i1> %m, <8 x float> %a, <8 x float> %passthru, i32 %vl)274  ret <8 x float> %b275}276 277; Test load operation by vp.load.278define <8 x i32> @vpselect_vpload(<8 x i32> %passthru, ptr %p, <8 x i1> %m, i32 zeroext %vl) {279; CHECK-LABEL: vpselect_vpload:280; CHECK:       # %bb.0:281; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, mu282; CHECK-NEXT:    vle32.v v8, (a0), v0.t283; CHECK-NEXT:    ret284  %a = call <8 x i32> @llvm.vp.load.v8i32.p0(ptr %p, <8 x i1> splat (i1 true), i32 %vl)285  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)286  ret <8 x i32> %b287}288 289; Test result have chain and glued node.290define <8 x i32> @vpselect_vpload2(<8 x i32> %passthru, ptr %p, <8 x i32> %x, <8 x i32> %y, i32 zeroext %vl) {291; CHECK-LABEL: vpselect_vpload2:292; CHECK:       # %bb.0:293; CHECK-NEXT:    vsetvli zero, a1, e32, m1, ta, mu294; CHECK-NEXT:    vmseq.vv v0, v9, v10295; CHECK-NEXT:    vle32.v v8, (a0), v0.t296; CHECK-NEXT:    ret297  %a = call <8 x i32> @llvm.vp.load.v8i32.p0(ptr %p, <8 x i1> splat (i1 true), i32 %vl)298  %m = call <8 x i1> @llvm.vp.icmp.v8i32(<8 x i32> %x, <8 x i32> %y, metadata !"eq", <8 x i1> splat (i1 true), i32 %vl)299  %b = call <8 x i32> @llvm.vp.select.v8i32(<8 x i1> %m, <8 x i32> %a, <8 x i32> %passthru, i32 %vl)300  ret <8 x i32> %b301}302