diff --git a/llvm/include/llvm/IR/IntrinsicsRISCV.td b/llvm/include/llvm/IR/IntrinsicsRISCV.td index 1d58860a0afc8..4c4e7351212f8 100644 --- a/llvm/include/llvm/IR/IntrinsicsRISCV.td +++ b/llvm/include/llvm/IR/IntrinsicsRISCV.td @@ -661,7 +661,7 @@ let TargetPrefix = "riscv" in { : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty, llvm_anyint_ty], - [IntrNoMem, IntrHasSideEffects]>, RISCVVIntrinsic { + [IntrNoMem]>, RISCVVIntrinsic { let ScalarOperand = 2; let VLOperand = 3; } @@ -684,7 +684,7 @@ let TargetPrefix = "riscv" in { [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty, LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty, LLVMMatchType<2>], - [ImmArg>, IntrNoMem, IntrHasSideEffects]>, RISCVVIntrinsic { + [ImmArg>, IntrNoMem]>, RISCVVIntrinsic { let ScalarOperand = 2; let VLOperand = 4; } @@ -708,7 +708,7 @@ let TargetPrefix = "riscv" in { : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty, llvm_anyint_ty, LLVMMatchType<2>], - [ImmArg>, IntrNoMem, IntrHasSideEffects]>, + [ImmArg>, IntrNoMem]>, RISCVVIntrinsic { let VLOperand = 4; } @@ -721,7 +721,7 @@ let TargetPrefix = "riscv" in { [LLVMMatchType<0>, LLVMMatchType<0>, llvm_any_ty, LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty, LLVMMatchType<2>, LLVMMatchType<2>], - [ImmArg>,ImmArg>, IntrNoMem, IntrHasSideEffects]>, + [ImmArg>,ImmArg>, IntrNoMem]>, RISCVVIntrinsic { let VLOperand = 5; } @@ -733,7 +733,7 @@ let TargetPrefix = "riscv" in { : DefaultAttrsIntrinsic<[llvm_anyvector_ty], [LLVMMatchType<0>, llvm_anyvector_ty, llvm_any_ty, llvm_anyint_ty, LLVMMatchType<3>], - [ImmArg>, IntrNoMem, IntrHasSideEffects]>, + [ImmArg>, IntrNoMem]>, RISCVVIntrinsic { let VLOperand = 4; } @@ -746,8 +746,7 @@ let TargetPrefix = "riscv" in { [LLVMMatchType<0>, llvm_anyvector_ty, llvm_any_ty, LLVMScalarOrSameVectorWidth<0, llvm_i1_ty>, llvm_anyint_ty, LLVMMatchType<3>, LLVMMatchType<3>], - [ImmArg>, ImmArg>, IntrNoMem, - IntrHasSideEffects]>, RISCVVIntrinsic { + [ImmArg>, ImmArg>, IntrNoMem]>, RISCVVIntrinsic { let VLOperand = 5; } // Input: (vector_in, vector_in, scalar_in, vl, policy) diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index b0568297a470a..da1543bd7112a 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -3668,7 +3668,6 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) { } // Skip if True has side effect. - // TODO: Support vleff and vlsegff. if (TII->get(TrueOpc).hasUnmodeledSideEffects()) return false; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td index fc60a9cc7cd30..22e5488617846 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoVPseudos.td @@ -6232,7 +6232,7 @@ defm PseudoVSUX : VPseudoIStore; //===----------------------------------------------------------------------===// // vleff may update VL register -let hasSideEffects = 1, Defs = [VL] in +let Defs = [VL] in defm PseudoVL : VPseudoFFLoad; //===----------------------------------------------------------------------===// @@ -6248,7 +6248,7 @@ defm PseudoVSOXSEG : VPseudoISegStore; defm PseudoVSUXSEG : VPseudoISegStore; // vlsegeff.v may update VL register -let hasSideEffects = 1, Defs = [VL] in { +let Defs = [VL] in { defm PseudoVLSEG : VPseudoUSSegLoadFF; } @@ -6450,7 +6450,7 @@ defm PseudoVMV_V : VPseudoUnaryVMV_V_X_I; //===----------------------------------------------------------------------===// // 12.1. Vector Single-Width Saturating Add and Subtract //===----------------------------------------------------------------------===// -let Defs = [VXSAT], hasSideEffects = 1 in { +let Defs = [VXSAT] in { defm PseudoVSADDU : VPseudoVSALU_VV_VX_VI; defm PseudoVSADD : VPseudoVSALU_VV_VX_VI; defm PseudoVSSUBU : VPseudoVSALU_VV_VX; @@ -6468,7 +6468,7 @@ defm PseudoVASUB : VPseudoVAALU_VV_VX_RM; //===----------------------------------------------------------------------===// // 12.3. Vector Single-Width Fractional Multiply with Rounding and Saturation //===----------------------------------------------------------------------===// -let Defs = [VXSAT], hasSideEffects = 1 in { +let Defs = [VXSAT] in { defm PseudoVSMUL : VPseudoVSMUL_VV_VX_RM; } @@ -6481,7 +6481,7 @@ defm PseudoVSSRA : VPseudoVSSHT_VV_VX_VI_RM; //===----------------------------------------------------------------------===// // 12.5. Vector Narrowing Fixed-Point Clip Instructions //===----------------------------------------------------------------------===// -let Defs = [VXSAT], hasSideEffects = 1 in { +let Defs = [VXSAT] in { defm PseudoVNCLIP : VPseudoVNCLP_WV_WX_WI_RM; defm PseudoVNCLIPU : VPseudoVNCLP_WV_WX_WI_RM; } diff --git a/llvm/test/CodeGen/RISCV/regalloc-last-chance-recoloring-failure.ll b/llvm/test/CodeGen/RISCV/regalloc-last-chance-recoloring-failure.ll index 3ce56318426ad..81ef6072449e8 100644 --- a/llvm/test/CodeGen/RISCV/regalloc-last-chance-recoloring-failure.ll +++ b/llvm/test/CodeGen/RISCV/regalloc-last-chance-recoloring-failure.ll @@ -26,7 +26,10 @@ define void @last_chance_recoloring_failure() { ; CHECK-NEXT: li a0, 55 ; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma ; CHECK-NEXT: vloxseg2ei32.v v16, (a0), v8 -; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: csrr a0, vlenb +; CHECK-NEXT: slli a0, a0, 3 +; CHECK-NEXT: add a0, sp, a0 +; CHECK-NEXT: addi a0, a0, 16 ; CHECK-NEXT: csrr a1, vlenb ; CHECK-NEXT: slli a1, a1, 2 ; CHECK-NEXT: vs4r.v v16, (a0) # Unknown-size Folded Spill @@ -37,37 +40,24 @@ define void @last_chance_recoloring_failure() { ; CHECK-NEXT: li s0, 36 ; CHECK-NEXT: vsetvli zero, s0, e16, m4, ta, ma ; CHECK-NEXT: vfwadd.vv v16, v8, v12, v0.t -; CHECK-NEXT: csrr a0, vlenb -; CHECK-NEXT: slli a0, a0, 3 -; CHECK-NEXT: add a0, sp, a0 -; CHECK-NEXT: addi a0, a0, 16 +; CHECK-NEXT: addi a0, sp, 16 ; CHECK-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill ; CHECK-NEXT: call func -; CHECK-NEXT: li a0, 32 -; CHECK-NEXT: vsetvli zero, a0, e16, m4, ta, ma -; CHECK-NEXT: vrgather.vv v16, v8, v12, v0.t ; CHECK-NEXT: vsetvli zero, s0, e16, m4, ta, ma -; CHECK-NEXT: addi a1, sp, 16 -; CHECK-NEXT: csrr a2, vlenb -; CHECK-NEXT: slli a2, a2, 2 -; CHECK-NEXT: vl4r.v v20, (a1) # Unknown-size Folded Reload -; CHECK-NEXT: add a1, a1, a2 -; CHECK-NEXT: vl4r.v v24, (a1) # Unknown-size Folded Reload -; CHECK-NEXT: csrr a1, vlenb -; CHECK-NEXT: slli a1, a1, 3 -; CHECK-NEXT: add a1, sp, a1 -; CHECK-NEXT: addi a1, a1, 16 -; CHECK-NEXT: vl8r.v v0, (a1) # Unknown-size Folded Reload -; CHECK-NEXT: vfwsub.wv v8, v0, v20 -; CHECK-NEXT: vsetvli zero, a0, e16, m4, tu, mu -; CHECK-NEXT: vssubu.vv v16, v16, v8, v0.t -; CHECK-NEXT: vsetvli zero, s0, e32, m8, tu, mu ; CHECK-NEXT: csrr a0, vlenb ; CHECK-NEXT: slli a0, a0, 3 ; CHECK-NEXT: add a0, sp, a0 ; CHECK-NEXT: addi a0, a0, 16 -; CHECK-NEXT: vl8r.v v16, (a0) # Unknown-size Folded Reload -; CHECK-NEXT: vfdiv.vv v8, v16, v8, v0.t +; CHECK-NEXT: csrr a1, vlenb +; CHECK-NEXT: slli a1, a1, 2 +; CHECK-NEXT: vl4r.v v16, (a0) # Unknown-size Folded Reload +; CHECK-NEXT: add a0, a0, a1 +; CHECK-NEXT: vl4r.v v20, (a0) # Unknown-size Folded Reload +; CHECK-NEXT: addi a0, sp, 16 +; CHECK-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload +; CHECK-NEXT: vfwsub.wv v8, v24, v16 +; CHECK-NEXT: vsetvli zero, zero, e32, m8, tu, mu +; CHECK-NEXT: vfdiv.vv v8, v24, v8, v0.t ; CHECK-NEXT: vse32.v v8, (a0) ; CHECK-NEXT: csrr a0, vlenb ; CHECK-NEXT: slli a0, a0, 4 @@ -109,25 +99,20 @@ define void @last_chance_recoloring_failure() { ; SUBREGLIVENESS-NEXT: addi a0, sp, 16 ; SUBREGLIVENESS-NEXT: vs8r.v v16, (a0) # Unknown-size Folded Spill ; SUBREGLIVENESS-NEXT: call func -; SUBREGLIVENESS-NEXT: li a0, 32 -; SUBREGLIVENESS-NEXT: vsetvli zero, a0, e16, m4, ta, ma -; SUBREGLIVENESS-NEXT: vrgather.vv v16, v8, v12, v0.t ; SUBREGLIVENESS-NEXT: vsetvli zero, s0, e16, m4, ta, ma +; SUBREGLIVENESS-NEXT: csrr a0, vlenb +; SUBREGLIVENESS-NEXT: slli a0, a0, 3 +; SUBREGLIVENESS-NEXT: add a0, sp, a0 +; SUBREGLIVENESS-NEXT: addi a0, a0, 16 ; SUBREGLIVENESS-NEXT: csrr a1, vlenb -; SUBREGLIVENESS-NEXT: slli a1, a1, 3 -; SUBREGLIVENESS-NEXT: add a1, sp, a1 -; SUBREGLIVENESS-NEXT: addi a1, a1, 16 -; SUBREGLIVENESS-NEXT: csrr a2, vlenb -; SUBREGLIVENESS-NEXT: slli a2, a2, 2 -; SUBREGLIVENESS-NEXT: vl4r.v v20, (a1) # Unknown-size Folded Reload -; SUBREGLIVENESS-NEXT: add a1, a1, a2 -; SUBREGLIVENESS-NEXT: vl4r.v v24, (a1) # Unknown-size Folded Reload -; SUBREGLIVENESS-NEXT: addi a1, sp, 16 -; SUBREGLIVENESS-NEXT: vl8r.v v24, (a1) # Unknown-size Folded Reload -; SUBREGLIVENESS-NEXT: vfwsub.wv v8, v24, v20 -; SUBREGLIVENESS-NEXT: vsetvli zero, a0, e16, m4, tu, mu -; SUBREGLIVENESS-NEXT: vssubu.vv v16, v16, v8, v0.t -; SUBREGLIVENESS-NEXT: vsetvli zero, s0, e32, m8, tu, mu +; SUBREGLIVENESS-NEXT: slli a1, a1, 2 +; SUBREGLIVENESS-NEXT: vl4r.v v16, (a0) # Unknown-size Folded Reload +; SUBREGLIVENESS-NEXT: add a0, a0, a1 +; SUBREGLIVENESS-NEXT: vl4r.v v20, (a0) # Unknown-size Folded Reload +; SUBREGLIVENESS-NEXT: addi a0, sp, 16 +; SUBREGLIVENESS-NEXT: vl8r.v v24, (a0) # Unknown-size Folded Reload +; SUBREGLIVENESS-NEXT: vfwsub.wv v8, v24, v16 +; SUBREGLIVENESS-NEXT: vsetvli zero, zero, e32, m8, tu, mu ; SUBREGLIVENESS-NEXT: vfdiv.vv v8, v24, v8, v0.t ; SUBREGLIVENESS-NEXT: vse32.v v8, (a0) ; SUBREGLIVENESS-NEXT: csrr a0, vlenb diff --git a/llvm/test/CodeGen/RISCV/rvv/commutable.ll b/llvm/test/CodeGen/RISCV/rvv/commutable.ll index 06a6327d3892b..d94b529bac017 100644 --- a/llvm/test/CodeGen/RISCV/rvv/commutable.ll +++ b/llvm/test/CodeGen/RISCV/rvv/commutable.ll @@ -655,10 +655,9 @@ define @commutable_vsadd_vv( %0, @llvm.riscv.vsadd.nxv1i64.nxv1i64( undef, %0, %1, iXLen %2) @@ -673,7 +672,7 @@ define @commutable_vsadd_vv_masked( %0, @commutable_vsaddu_vv( %0, @llvm.riscv.vsaddu.nxv1i64.nxv1i64( undef, %0, %1, iXLen %2) @@ -707,7 +705,7 @@ define @commutable_vsaddu_vv_masked( %0, @commutable_vsmul_vv( %0, @llvm.riscv.vsmul.nxv1i64.nxv1i64( undef, %0, %1, iXLen 0, iXLen %2) @@ -813,7 +810,7 @@ define @commutable_vsmul_vv_masked( %0, %passthru, ptr %p, , i64 } @llvm.riscv.vleff.nxv2i32(, ptr, i64) define @vpmerge_vleff( %passthru, ptr %p, %m, i32 zeroext %vl) { ; CHECK-LABEL: vpmerge_vleff: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma -; CHECK-NEXT: vle32ff.v v9, (a0) -; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, ma -; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 +; CHECK-NEXT: vsetvli zero, a1, e32, m1, tu, mu +; CHECK-NEXT: vle32ff.v v8, (a0), v0.t ; CHECK-NEXT: ret %1 = zext i32 %vl to i64 %a = call { , i64 } @llvm.riscv.vleff.nxv2i32( undef, ptr %p, i64 %1) @@ -634,14 +631,11 @@ define void @vpselect_vpload_store( %passthru, ptr %p, @vpselect_vleff( %passthru, ptr %p, %m, i32 zeroext %vl) { ; CHECK-LABEL: vpselect_vleff: ; CHECK: # %bb.0: -; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma -; CHECK-NEXT: vle32ff.v v9, (a0) -; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma -; CHECK-NEXT: vmerge.vvm v8, v8, v9, v0 +; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, mu +; CHECK-NEXT: vle32ff.v v8, (a0), v0.t ; CHECK-NEXT: ret %1 = zext i32 %vl to i64 %a = call { , i64 } @llvm.riscv.vleff.nxv2i32( undef, ptr %p, i64 %1) @@ -898,22 +892,20 @@ define @vpselect_trunc( %passthru, @llvm.riscv.vle.nxv32i16.i64( undef, ptr null, i64 1)