; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py ; RUN: llc < %s -mtriple=riscv64 -mattr=+v -verify-machineinstrs | FileCheck %s define @vpmerge_mf8( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_mf8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e8, mf8, tu, ma ; CHECK-NEXT: vmv.v.v v8, v9 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv1i8( splat (i1 -1), %y, %x, i32 %vl) ret %1 } define @vpmerge_mf4( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_mf4: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e8, mf4, tu, ma ; CHECK-NEXT: vmv.v.v v8, v9 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv2i8( splat (i1 -1), %y, %x, i32 %vl) ret %1 } define @vpmerge_mf2( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_mf2: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e8, mf2, tu, ma ; CHECK-NEXT: vmv.v.v v8, v9 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv4i8( splat (i1 -1), %y, %x, i32 %vl) ret %1 } define @vpmerge_m1( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_m1: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e8, m1, tu, ma ; CHECK-NEXT: vmv.v.v v8, v9 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv8i8( splat (i1 -1), %y, %x, i32 %vl) ret %1 } define @vpmerge_m2( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_m2: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e16, m2, tu, ma ; CHECK-NEXT: vmv.v.v v8, v10 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv8i16( splat (i1 -1), %y, %x, i32 %vl) ret %1 } define @vpmerge_m4( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_m4: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e32, m4, tu, ma ; CHECK-NEXT: vmv.v.v v8, v12 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv8i32( splat (i1 -1), %y, %x, i32 %vl) ret %1 } define @vpmerge_m8( %x, %y, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_m8: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a0, e64, m8, tu, ma ; CHECK-NEXT: vmv.v.v v8, v16 ; CHECK-NEXT: ret %1 = call @llvm.vp.merge.nxv8i64( splat (i1 -1), %y, %x, i32 %vl) ret %1 } ; Shouldn't be converted because vmerge adds back in elements from false past avl that would be lost if we converted to vmv.v.v define @preserve_false(ptr %p, %pt, %false, %mask, i64 %avl1, i64 %avl2) { ; CHECK-LABEL: preserve_false: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma ; CHECK-NEXT: vmv1r.v v10, v9 ; CHECK-NEXT: vle32.v v10, (a0), v0.t ; CHECK-NEXT: vsetvli zero, a2, e32, m1, tu, ma ; CHECK-NEXT: vmerge.vvm v8, v9, v10, v0 ; CHECK-NEXT: ret %true = call @llvm.riscv.vle.mask( %false, ptr %p, %mask, i64 %avl1, i64 3) %res = call @llvm.riscv.vmerge( %pt, %false, %true, %mask, i64 %avl2) ret %res } ; Can fold this because its avl is known to be <= than true, so no elements from false need to be introduced past avl. define @preserve_false_avl_known_le(ptr %p, %pt, %false, %mask) { ; CHECK-LABEL: preserve_false_avl_known_le: ; CHECK: # %bb.0: ; CHECK-NEXT: vsetivli zero, 1, e32, m1, ta, mu ; CHECK-NEXT: vle32.v v9, (a0), v0.t ; CHECK-NEXT: vsetvli zero, zero, e32, m1, tu, ma ; CHECK-NEXT: vmv.v.v v8, v9 ; CHECK-NEXT: ret %true = call @llvm.riscv.vle.mask( %false, ptr %p, %mask, i64 2, i64 3) %res = call @llvm.riscv.vmerge( %pt, %false, %true, %mask, i64 1) ret %res } define <4 x i16> @pr173141(i1 %0, <2 x i16> %conv33) { ; CHECK-LABEL: pr173141: ; CHECK: # %bb.0: # %entry ; CHECK-NEXT: vsetivli zero, 1, e16, mf4, ta, ma ; CHECK-NEXT: vslidedown.vi v8, v8, 1 ; CHECK-NEXT: vmv.x.s a0, v8 ; CHECK-NEXT: vsetivli zero, 4, e16, mf2, ta, ma ; CHECK-NEXT: vmv.v.x v8, a0 ; CHECK-NEXT: ret entry: %1 = tail call i32 @llvm.riscv.orc.b.i32(i32 1) %sub.i = add i32 %1, 1 %2 = and i32 %sub.i, 1 %and.i = zext i32 %2 to i64 %3 = select i1 %0, i64 0, i64 %and.i %tobool.not128 = icmp sgt i64 %3, -1 %4 = insertelement <4 x i1> zeroinitializer, i1 %tobool.not128, i64 0 %5 = shufflevector <4 x i1> %4, <4 x i1> zeroinitializer, <4 x i32> zeroinitializer %6 = shufflevector <2 x i16> %conv33, <2 x i16> zeroinitializer, <4 x i32> %7 = select <4 x i1> %5, <4 x i16> %6, <4 x i16> zeroinitializer ret <4 x i16> %7 }