[PATCH] D124684: [RISCV] Fix incorrect codegen for masked vmsge{u}.vx with mask agnostic.
Zakk Chen via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon May 2 18:04:19 PDT 2022
This revision was automatically updated to reflect the committed changes.
Closed by commit rG5807e59a0ab4: [RISCV] Fix incorrect codegen for masked vmsge{u}.vx with mask agnostic. (authored by khchen).
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D124684/new/
https://reviews.llvm.org/D124684
Files:
llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
llvm/test/CodeGen/RISCV/rvv/masked-tama.ll
Index: llvm/test/CodeGen/RISCV/rvv/masked-tama.ll
===================================================================
--- llvm/test/CodeGen/RISCV/rvv/masked-tama.ll
+++ llvm/test/CodeGen/RISCV/rvv/masked-tama.ll
@@ -1431,7 +1431,9 @@
; 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 <vscale x 1 x i1> @llvm.riscv.vmsge.mask.nxv1i64.i64(
Index: llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
===================================================================
--- llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
+++ llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
@@ -1121,16 +1121,15 @@
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;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D124684.426551.patch
Type: text/x-patch
Size: 1848 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220503/b6133f9d/attachment.bin>
More information about the llvm-commits
mailing list