@@ -2478,26 +2478,26 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
24782478 return false ;
24792479}
24802480
2481- std::optional<uint64_t >
2482- NVPTXDAGToDAGISel::FindRootAddressAndTotalOffset (SDValue Addr, SDValue &Base,
2483- uint64_t AccumulatedOffset) {
2484- if (isAddLike (Addr)) {
2485- if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand (1 ))) {
2486- SDValue base = Addr.getOperand (0 );
2487- AccumulatedOffset += CN->getZExtValue ();
2488- if (SelectDirectAddr (base, Base))
2489- return AccumulatedOffset;
2490- return FindRootAddressAndTotalOffset (base, Base, AccumulatedOffset);
2491- }
2492- }
2493- return std::nullopt ;
2494- }
2495-
24962481// symbol+offset
24972482bool NVPTXDAGToDAGISel::SelectADDRsi_imp (SDNode *OpNode, SDValue Addr,
24982483 SDValue &Base, SDValue &Offset,
24992484 MVT mvt) {
2500- if (auto AccumulatedOffset = FindRootAddressAndTotalOffset (Addr, Base, 0 )) {
2485+ std::function<std::optional<uint64_t >(SDValue, uint64_t )>
2486+ FindRootAddressAndTotalOffset =
2487+ [&](SDValue Addr,
2488+ uint64_t AccumulatedOffset) -> std::optional<uint64_t > {
2489+ if (isAddLike (Addr)) {
2490+ if (ConstantSDNode *CN = dyn_cast<ConstantSDNode>(Addr.getOperand (1 ))) {
2491+ SDValue base = Addr.getOperand (0 );
2492+ AccumulatedOffset += CN->getZExtValue ();
2493+ if (SelectDirectAddr (base, Base))
2494+ return AccumulatedOffset;
2495+ return FindRootAddressAndTotalOffset (base, AccumulatedOffset);
2496+ }
2497+ }
2498+ return std::nullopt ;
2499+ };
2500+ if (auto AccumulatedOffset = FindRootAddressAndTotalOffset (Addr, 0 )) {
25012501 Offset = CurDAG->getTargetConstant (*AccumulatedOffset, SDLoc (OpNode), mvt);
25022502 return true ;
25032503 }
0 commit comments