[PATCH] D115653: [DAG]Introduce llvm::processShuffleMasks and use it for shuffles in DAG Type Legalizer.

Sanjay Patel via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 11 10:41:50 PST 2022


spatel added a comment.

I had never looked at the existing code, and I find that confusing already, so some high-level questions:

1. For legalization, it seems like the code was written with the potential to split by more than a factor of 2, but that can't happen with the current interface (hard-coded to output Lo and Hi halves). Is the new code intended to allow splitting by >2?
2. In SDAG, we always have equal size input/output vector for shuffle node. Is the new code planned to be used with the IR version of shuffles (where input vectors may have different size than output)?
3. IIUC, the interesting case is when we need to shuffle together from >2 inputs. Would it make sense to handle the easy cases (0,1,2 inputs) in a separate function?

For example for #3, I think we could handle the simplest (NoInput) pattern before the main loop with something like:

  unsigned MaskSize = N->getMask().size();
  ArrayRef<int> LoMask = N->getMask().drop_back(NewElts);
  if (all_of(LoMask, [MaskSize](int MaskElt) { return (unsigned)MaskElt >= MaskSize * 2; })) {
    Lo = DAG.getUNDEF(NewVT);
  }
  ArrayRef<int> HiMask = N->getMask().drop_front(NewElts);
  if (all_of(HiMask, [MaskSize](int MaskElt) { return (unsigned)MaskElt >= MaskSize * 2; })) {
    Hi = DAG.getUNDEF(NewVT);
  }


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D115653/new/

https://reviews.llvm.org/D115653



More information about the llvm-commits mailing list