[llvm] [RISCV] Attempt to widen SEW before generic shuffle lowering (PR #122311)
Luke Lau via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 9 18:22:37 PST 2025
================
@@ -5261,6 +5261,42 @@ static SDValue lowerDisjointIndicesShuffle(ShuffleVectorSDNode *SVN,
return DAG.getVectorShuffle(VT, DL, Select, DAG.getUNDEF(VT), NewMask);
}
+/// Try to widen element type to get a new mask value for a better permutation
+/// sequence. This doesn't try to inspect the widened mask for profitability;
+/// we speculate the widened form is equal or better. This has the effect of
+/// reducing mask constant sizes - allowing cheaper materialization sequences
+/// - and index sequence sizes - reducing register pressure and materialization
+/// cost, at the cost of (possibly) an extra VTYPE toggle.
+static SDValue tryWidenMaskForShuffle(SDValue Op, SelectionDAG &DAG) {
+ SDLoc DL(Op);
+ EVT VT = Op.getValueType();
+ EVT ScalarVT = VT.getVectorElementType();
+ unsigned ElementSize = ScalarVT.getFixedSizeInBits();
+ SDValue V0 = Op.getOperand(0);
+ SDValue V1 = Op.getOperand(1);
+ ArrayRef<int> Mask = cast<ShuffleVectorSDNode>(Op)->getMask();
+
+ // Avoid wasted work leading to isTypeLegal check failing below
+ if (ElementSize > 32)
+ return SDValue();
+
+ SmallVector<int, 8> NewMask;
+ if (widenShuffleMaskElts(Mask, NewMask)) {
+ MVT NewEltVT = VT.isFloatingPoint()
+ ? MVT::getFloatingPointVT(ElementSize * 2)
+ : MVT::getIntegerVT(ElementSize * 2);
+ MVT NewVT = MVT::getVectorVT(NewEltVT, VT.getVectorNumElements() / 2);
+ if (DAG.getTargetLoweringInfo().isTypeLegal(NewVT)) {
+ V0 = DAG.getBitcast(NewVT, V0);
+ V1 = DAG.getBitcast(NewVT, V1);
+ return DAG.getBitcast(VT,
+ DAG.getVectorShuffle(NewVT, DL, V0, V1, NewMask));
+ }
+ }
----------------
lukel97 wrote:
Nit, structure these checks as early returns?
https://github.com/llvm/llvm-project/pull/122311
More information about the llvm-commits
mailing list