[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