[llvm] [NVPTX] Remove redundant addressing mode instrs (PR #128044)

Alex MacLean via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 20 11:58:49 PST 2025


================
@@ -2581,93 +2307,56 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
   return false;
 }
 
-// symbol+offset
-bool NVPTXDAGToDAGISel::SelectADDRsi_imp(SDNode *OpNode, SDValue Addr,
-                                         SDValue &Base, SDValue &Offset,
-                                         MVT VT) {
-  std::function<std::optional<uint64_t>(SDValue, uint64_t)>
-      FindRootAddressAndTotalOffset =
-          [&](SDValue Addr,
-              uint64_t AccumulatedOffset) -> std::optional<uint64_t> {
-    if (isAddLike(Addr)) {
-      if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1))) {
-        SDValue PossibleBaseAddr = Addr.getOperand(0);
-        AccumulatedOffset += CN->getZExtValue();
-        if (SelectDirectAddr(PossibleBaseAddr, Base))
-          return AccumulatedOffset;
-        return FindRootAddressAndTotalOffset(PossibleBaseAddr,
-                                             AccumulatedOffset);
-      }
-    }
-    return std::nullopt;
-  };
-  if (auto AccumulatedOffset = FindRootAddressAndTotalOffset(Addr, 0)) {
-    Offset = CurDAG->getTargetConstant(*AccumulatedOffset, SDLoc(OpNode), VT);
-    return true;
+static SDValue accumulateOffset(SDValue &Addr, SDLoc DL, SelectionDAG *DAG) {
+  APInt AccumulatedOffset(64u, 0);
+  while (isAddLike(Addr)) {
+    const auto *CN = dyn_cast<ConstantSDNode>(Addr.getOperand(1));
+    if (!CN)
+      break;
+
+    const APInt CI = CN->getAPIntValue().sext(64);
+    if (!(CI + AccumulatedOffset).isSignedIntN(32))
+      break;
+
+    AccumulatedOffset += CI;
+    Addr = Addr->getOperand(0);
   }
-  return false;
+  return DAG->getSignedTargetConstant(AccumulatedOffset.getSExtValue(), DL,
+                                      MVT::i32);
----------------
AlexMaclean wrote:

We already have a test case for this: https://github.com/llvm/llvm-project/blob/df9d3c20fa0a68a6aeb3174d15279e5e6cf41436/llvm/test/CodeGen/NVPTX/addr-mode.ll#L70-L85

It's still passing because the check in the loop above:
```cpp
    if (!(CI + AccumulatedOffset).isSignedIntN(32))
      break;
```

https://github.com/llvm/llvm-project/pull/128044


More information about the llvm-commits mailing list