[llvm] [RISCV] Narrow indices of fixed vector gather/scatter nodes (PR #66405)
Craig Topper via llvm-commits
llvm-commits at lists.llvm.org
Fri Sep 15 13:47:27 PDT 2023
================
@@ -11616,15 +11616,44 @@ static SDValue performXORCombine(SDNode *N, SelectionDAG &DAG,
return combineSelectAndUseCommutative(N, DAG, /*AllOnes*/ false, Subtarget);
}
-// According to the property that indexed load/store instructions
-// zero-extended their indices, \p narrowIndex tries to narrow the type of index
-// operand if it is matched to pattern (shl (zext x to ty), C) and bits(x) + C <
-// bits(ty).
+/// According to the property that indexed load/store instructions zero-extended
+/// their indices, try to narrow the type of index operand.
static bool narrowIndex(SDValue &N, ISD::MemIndexType IndexType, SelectionDAG &DAG) {
if (isIndexTypeSigned(IndexType))
return false;
- if (N.getOpcode() != ISD::SHL || !N->hasOneUse())
+ if (!N->hasOneUse())
+ return false;
+
+ EVT VT = N.getValueType();
+ SDLoc DL(N);
+
+ // In general, what we're doing here is seeing if we can sink a truncate to
+ // a smaller element type into the expresson tree building our index.
+ // TODO: We can generalize this and handle a bunch more cases if useful.
+
+ // Narrow a buildvector to the narrowest element type. This requires less
+ // work and less register pressure at high LMUL, and creates smaller constants
+ // which may be cheaper to materialize.
+ if (ISD::isBuildVectorOfConstantSDNodes(N.getNode())) {
+ KnownBits Known = DAG.computeKnownBits(N);
+ unsigned ActiveBits = Known.countMaxActiveBits();
+ EVT ResultVT = VT.getVectorElementType();
----------------
topperc wrote:
Maybe something like?
`EVT ResultVT = EVT::getIntegerType(Context, ActiveBits).getRoundIntegerType(Context)`?
https://github.com/llvm/llvm-project/pull/66405
More information about the llvm-commits
mailing list