From: Zakk Chen Date: Tue, 3 May 2022 00:08:23 +0000 (-0700) Subject: [RISCV] Fix incorrect codegen for masked vmsge{u}.vx with mask agnostic. X-Git-Tag: upstream/15.0.7~8819 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=5807e59a0ab4c6fbe372af68cc7980ed6ff9239c;p=platform%2Fupstream%2Fllvm.git [RISCV] Fix incorrect codegen for masked vmsge{u}.vx with mask agnostic. The result was totally wrong. We could use mask undisturbed result to emulate the mask agnostic result. Reviewed By: craig.topper Differential Revision: https://reviews.llvm.org/D124684 --- diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp index de9c151..7fae031 100644 --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp @@ -1121,16 +1121,15 @@ void RISCVDAGToDAGISel::Select(SDNode *Node) { SDValue V0 = CurDAG->getRegister(RISCV::V0, VT); // Otherwise use - // vmslt{u}.vx vd, va, x, v0.t; if mask policy is agnostic. + // vmslt{u}.vx vd, va, x, v0.t; vmxor.mm vd, vd, v0 + // The result is mask undisturbed. + // We use the same instructions to emulate mask agnostic behavior, because + // the agnostic result can be either undisturbed or all 1. SDValue Cmp = SDValue( CurDAG->getMachineNode(VMSLTMaskOpcode, DL, VT, {MaskedOff, Src1, Src2, V0, VL, SEW, Glue}), 0); - if (MaskedOff.isUndef()) { - ReplaceNode(Node, Cmp.getNode()); - return; - } - // Need vmxor.mm vd, vd, v0 to assign inactive value. + // vmxor.mm vd, vd, v0 is used to update active value. ReplaceNode(Node, CurDAG->getMachineNode(VMXOROpcode, DL, VT, {Cmp, Mask, VL, MaskSEW})); return; diff --git a/llvm/test/CodeGen/RISCV/rvv/masked-tama.ll b/llvm/test/CodeGen/RISCV/rvv/masked-tama.ll index deac535..26c7509 100644 --- a/llvm/test/CodeGen/RISCV/rvv/masked-tama.ll +++ b/llvm/test/CodeGen/RISCV/rvv/masked-tama.ll @@ -1431,7 +1431,9 @@ define @intrinsic_vmsge_mask_vx_nxv1i64_i64( ; RV64-LABEL: intrinsic_vmsge_mask_vx_nxv1i64_i64: ; RV64: # %bb.0: # %entry ; RV64-NEXT: vsetvli zero, a1, e64, m1, ta, ma -; RV64-NEXT: vmslt.vx v0, v8, a0, v0.t +; RV64-NEXT: vmslt.vx v8, v8, a0, v0.t +; RV64-NEXT: vsetvli zero, zero, e8, mf8, ta, mu +; RV64-NEXT: vmxor.mm v0, v8, v0 ; RV64-NEXT: ret entry: %a = call @llvm.riscv.vmsge.mask.nxv1i64.i64(