@@ -2472,26 +2472,26 @@ bool NVPTXDAGToDAGISel::SelectDirectAddr(SDValue N, SDValue &Address) {
2472
2472
return false ;
2473
2473
}
2474
2474
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
-
2490
2475
// symbol+offset
2491
2476
bool NVPTXDAGToDAGISel::SelectADDRsi_imp (SDNode *OpNode, SDValue Addr,
2492
2477
SDValue &Base, SDValue &Offset,
2493
2478
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 )) {
2495
2495
Offset = CurDAG->getTargetConstant (*AccumulatedOffset, SDLoc (OpNode), mvt);
2496
2496
return true ;
2497
2497
}
0 commit comments