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