From: Craig Topper Date: Wed, 21 Apr 2021 07:25:42 +0000 (-0700) Subject: [RISCV] Temporary in vmsge(u).vx pseudo instructions can't be V0. X-Git-Tag: llvmorg-14-init~8868 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a8822caa1baee753273d44b483a636a179791fdc;p=platform%2Fupstream%2Fllvm.git [RISCV] Temporary in vmsge(u).vx pseudo instructions can't be V0. This was checked in some asserts, but not enforced by the instruction matching. There's still a second bug that we don't check that vt and vd are different registers, but that will require custom checking. Differential Revision: https://reviews.llvm.org/D100928 --- diff --git a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp index b933193..1130e754 100644 --- a/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp +++ b/llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp @@ -2419,6 +2419,8 @@ void RISCVAsmParser::emitVMSGE(MCInst &Inst, unsigned Opcode, SMLoc IDLoc, // pseudoinstruction: vmsge{u}.vx vd, va, x, v0.t, vt // expansion: vmslt{u}.vx vt, va, x; vmandnot.mm vt, v0, vt; vmandnot.mm vd, // vd, v0; vmor.mm vd, vt, vd + assert(Inst.getOperand(1).getReg() != RISCV::V0 && + "The temporary vector register should not be V0."); emitToStreamer(Out, MCInstBuilder(Opcode) .addOperand(Inst.getOperand(1)) .addOperand(Inst.getOperand(2)) diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td index 88c1c11..3424971 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoV.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoV.td @@ -663,10 +663,10 @@ def PseudoVMSGEU_VX_M : Pseudo<(outs VRNoV0:$vd), def PseudoVMSGE_VX_M : Pseudo<(outs VRNoV0:$vd), (ins VR:$vs2, GPR:$rs1, VMaskOp:$vm), [], "vmsge.vx", "$vd, $vs2, $rs1$vm">; -def PseudoVMSGEU_VX_M_T : Pseudo<(outs VR:$vd, VR:$scratch), +def PseudoVMSGEU_VX_M_T : Pseudo<(outs VR:$vd, VRNoV0:$scratch), (ins VR:$vs2, GPR:$rs1, VMaskOp:$vm), [], "vmsgeu.vx", "$vd, $vs2, $rs1$vm, $scratch">; -def PseudoVMSGE_VX_M_T : Pseudo<(outs VR:$vd, VR:$scratch), +def PseudoVMSGE_VX_M_T : Pseudo<(outs VR:$vd, VRNoV0:$scratch), (ins VR:$vs2, GPR:$rs1, VMaskOp:$vm), [], "vmsge.vx", "$vd, $vs2, $rs1$vm, $scratch">; } diff --git a/llvm/test/MC/RISCV/rvv/invalid.s b/llvm/test/MC/RISCV/rvv/invalid.s index 6c6cdaf..35a88e4 100644 --- a/llvm/test/MC/RISCV/rvv/invalid.s +++ b/llvm/test/MC/RISCV/rvv/invalid.s @@ -661,3 +661,8 @@ vs8r.v v6, (a0) vs8r.v v7, (a0) # CHECK-ERROR: invalid operand for instruction +vmsge.vx v2, v4, a0, v0.t, v0 +# CHECK-ERROR: invalid operand for instruction + +vmsgeu.vx v2, v4, a0, v0.t, v0 +# CHECK-ERROR: invalid operand for instruction