@@ -2472,26 +2472,26 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
24722472 return false ;
24732473}
24742474
2475- std::optional<uint64_t >
2476- NVPTXDAGToDAGISel::FindRootAddressAndTotalOffset (SDValue Addr, SDValue &Base,
2477- uint64_t AccumulatedOffset) {
2478- if (Addr.getOpcode () == ISD::ADD) {
2479- if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand (1 ))) {
2480- SDValue base = Addr.getOperand (0 );
2481- AccumulatedOffset += CN->getZExtValue ();
2482- if (SelectDirectAddr (base, Base))
2483- return AccumulatedOffset;
2484- return FindRootAddressAndTotalOffset (base, Base, AccumulatedOffset);
2485- }
2486- }
2487- return std::nullopt ;
2488- }
2489-
24902475// symbol+offset
24912476bool NVPTXDAGToDAGISel::SelectADDRsi_imp (SDNode *OpNode, SDValue Addr,
24922477 SDValue &Base, SDValue &Offset,
24932478 MVT mvt) {
2494- if (auto AccumulatedOffset = FindRootAddressAndTotalOffset (Addr, Base, 0 )) {
2479+ std::function<std::optional<uint64_t >(SDValue, uint64_t )>
2480+ FindRootAddressAndTotalOffset =
2481+ [&](SDValue Addr,
2482+ uint64_t AccumulatedOffset) -> std::optional<uint64_t > {
2483+ if (Addr.getOpcode () == ISD::ADD) {
2484+ if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand (1 ))) {
2485+ SDValue base = Addr.getOperand (0 );
2486+ AccumulatedOffset += CN->getZExtValue ();
2487+ if (SelectDirectAddr (base, Base))
2488+ return AccumulatedOffset;
2489+ return FindRootAddressAndTotalOffset (base, AccumulatedOffset);
2490+ }
2491+ }
2492+ return std::nullopt ;
2493+ };
2494+ if (auto AccumulatedOffset = FindRootAddressAndTotalOffset (Addr, 0 )) {
24952495 Offset = CurDAG->getTargetConstant (*AccumulatedOffset, SDLoc (OpNode), mvt);
24962496 return true ;
24972497 }
0 commit comments