[PATCH] D118345: [AArch64][SVE] Add more folds to make use of gather/scatter with 32-bit indices
    Sander de Smalen via Phabricator via llvm-commits 
    llvm-commits at lists.llvm.org
       
    Tue Feb  1 03:15:58 PST 2022
    
    
  
sdesmalen added inline comments.
================
Comment at: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:16182
+      Index.getOperand(0).getOperand(0).getOpcode() == ISD::STEP_VECTOR) {
+    if (auto Shift = DAG.getSplatValue(Index.getOperand(1)))
+      if (auto Offset = DAG.getSplatValue(Index.getOperand(0).getOperand(1))) {
----------------
Does the following work:
  if (auto *Shift = dyn_cast_or_null<ConstantSDNode>(DAG.getSplatValue(Index.getOperand(1))) {
    ..
  }
?
If so, that removes the need to do `auto *C = dyn_cast<ConstantSDNode>(Shift)` and the return if C == nullptr.
================
Comment at: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:16190
+                           ->getSExtValue();
+        // Stride = const << shift
+        Stride = Step << C->getSExtValue();
----------------
nit: the comment as-is seems redundant.
I think it's worth saying though that Stride is not scaled explicitly by 'Scale', because this is done implicitly by the gather/scatter addressing mode.
================
Comment at: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp:16192-16193
+        Stride = Step << C->getSExtValue();
+        Offset = DAG.getNode(ISD::MUL, DL, MVT::i64, Offset, N->getScale());
+        // BasePtr = BasePtr + (Offset << Shift)
+        Offset = DAG.getNode(ISD::SHL, DL, MVT::i64, Offset, Shift);
----------------
nit: Change to:
  // BasePtr = BasePtr + ((Offset * Scale) << Shift)
  Offset = DAG.getNode(ISD::MUL, DL, MVT::i64, Offset, N->getScale());
Repository:
  rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D118345/new/
https://reviews.llvm.org/D118345
    
    
More information about the llvm-commits
mailing list