[PATCH] D155071: [RISCV] Fold vmerge into its ops with smaller VL if known
Luke Lau via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 19 07:28:47 PDT 2023
luke marked 2 inline comments as not done.
luke added inline comments.
================
Comment at: llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp:3333
+
+ // Because N and True must have the same merge operand, the "effective" body
+ // is the minimum of their VLs. For example, if we have VL=3 and VL=5:
----------------
luke wrote:
> luke wrote:
> > reames wrote:
> > > Nit pick - have the same merge operand *or the merge on the True instruction doesn't exist and is thus undef*.
> > My mental model of this is that we need to have the same merge operand for both, but if the merge operand on True is undefined or missing, then we assume it's the same merge operand as N. Could we make this reasoning more explicit in the preceding code?
> Something like:
>
> ```
> diff --git a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
> index d956b303e584..6a084efa0a8f 100644
> --- a/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
> +++ b/llvm/lib/Target/RISCV/RISCVISelDAGToDAG.cpp
> @@ -3245,18 +3245,20 @@ bool RISCVDAGToDAGISel::performCombineVMergeAndVOps(SDNode *N) {
> if (!Info)
> return false;
>
> - if (HasTiedDest && !isImplicitDef(True->getOperand(0))) {
> - // The vmerge instruction must be TU.
> - // FIXME: This could be relaxed, but we need to handle the policy for the
> - // resulting op correctly.
> - if (isImplicitDef(Merge))
> - return false;
> - SDValue MergeOpTrue = True->getOperand(0);
> - // Both the vmerge instruction and the True instruction must have the same
> - // merge operand.
> - if (False != MergeOpTrue)
> - return false;
> - }
> + SDValue TrueMerge = HasTiedDest ? True->getOperand(0) : False;
> + if (isImplicitDef(TrueMerge))
> + TrueMerge = False;
> +
> + // Both the vmerge instruction and the True instruction must have the same
> + // merge operand.
> + if (TrueMerge != False)
> + return false;
> +
> + // The vmerge instruction must be TU.
> + // FIXME: This could be relaxed, but we need to handle the policy for the
> + // resulting op correctly.
> + if (isImplicitDef(Merge) && !isImplicitDef(TrueMerge))
> + return false;
>
> if (IsMasked) {
> assert(HasTiedDest && "Expected tied dest");
> ```
>
@reames Do you have any thoughts on the above?
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D155071/new/
https://reviews.llvm.org/D155071
More information about the llvm-commits
mailing list