@@ -1497,11 +1497,6 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFAddr64(SDValue Addr, SDValue &SRsrc,
1497
1497
return false ;
1498
1498
}
1499
1499
1500
- static bool isStackPtrRelative (const MachinePointerInfo &PtrInfo) {
1501
- auto PSV = PtrInfo.V .dyn_cast <const PseudoSourceValue *>();
1502
- return PSV && PSV->isStack ();
1503
- }
1504
-
1505
1500
std::pair<SDValue, SDValue> AMDGPUDAGToDAGISel::foldFrameIndex (SDValue N) const {
1506
1501
SDLoc DL (N);
1507
1502
@@ -1538,13 +1533,7 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFScratchOffen(SDNode *Parent,
1538
1533
AMDGPU::V_MOV_B32_e32, DL, MVT::i32 , HighBits);
1539
1534
VAddr = SDValue (MovHighBits, 0 );
1540
1535
1541
- // In a call sequence, stores to the argument stack area are relative to the
1542
- // stack pointer.
1543
- const MachinePointerInfo &PtrInfo
1544
- = cast<MemSDNode>(Parent)->getPointerInfo ();
1545
- SOffset = isStackPtrRelative (PtrInfo)
1546
- ? CurDAG->getRegister (Info->getStackPtrOffsetReg (), MVT::i32 )
1547
- : CurDAG->getTargetConstant (0 , DL, MVT::i32 );
1536
+ SOffset = CurDAG->getTargetConstant (0 , DL, MVT::i32 );
1548
1537
ImmOffset = CurDAG->getTargetConstant (Imm & 4095 , DL, MVT::i16 );
1549
1538
return true ;
1550
1539
}
@@ -1587,28 +1576,52 @@ bool AMDGPUDAGToDAGISel::SelectMUBUFScratchOffen(SDNode *Parent,
1587
1576
return true ;
1588
1577
}
1589
1578
1579
+ static bool IsCopyFromSGPR (const SIRegisterInfo &TRI, SDValue Val) {
1580
+ if (Val.getOpcode () != ISD::CopyFromReg)
1581
+ return false ;
1582
+ auto RC =
1583
+ TRI.getPhysRegClass (cast<RegisterSDNode>(Val.getOperand (1 ))->getReg ());
1584
+ return RC && TRI.isSGPRClass (RC);
1585
+ }
1586
+
1590
1587
bool AMDGPUDAGToDAGISel::SelectMUBUFScratchOffset (SDNode *Parent,
1591
1588
SDValue Addr,
1592
1589
SDValue &SRsrc,
1593
1590
SDValue &SOffset,
1594
1591
SDValue &Offset) const {
1595
- ConstantSDNode *CAddr = dyn_cast<ConstantSDNode>(Addr);
1596
- if (!CAddr || !SIInstrInfo::isLegalMUBUFImmOffset (CAddr->getZExtValue ()))
1597
- return false ;
1598
-
1599
- SDLoc DL (Addr);
1592
+ const SIRegisterInfo *TRI =
1593
+ static_cast <const SIRegisterInfo *>(Subtarget->getRegisterInfo ());
1600
1594
MachineFunction &MF = CurDAG->getMachineFunction ();
1601
1595
const SIMachineFunctionInfo *Info = MF.getInfo <SIMachineFunctionInfo>();
1596
+ SDLoc DL (Addr);
1602
1597
1603
- SRsrc = CurDAG->getRegister (Info->getScratchRSrcReg (), MVT::v4i32);
1598
+ // CopyFromReg <sgpr>
1599
+ if (IsCopyFromSGPR (*TRI, Addr)) {
1600
+ SRsrc = CurDAG->getRegister (Info->getScratchRSrcReg (), MVT::v4i32);
1601
+ SOffset = Addr;
1602
+ Offset = CurDAG->getTargetConstant (0 , DL, MVT::i16 );
1603
+ return true ;
1604
+ }
1604
1605
1605
- const MachinePointerInfo &PtrInfo = cast<MemSDNode>(Parent)->getPointerInfo ();
1606
+ ConstantSDNode *CAddr;
1607
+ if (Addr.getOpcode () == ISD::ADD) {
1608
+ // Add (CopyFromReg <sgpr>) <constant>
1609
+ CAddr = dyn_cast<ConstantSDNode>(Addr.getOperand (1 ));
1610
+ if (!CAddr || !SIInstrInfo::isLegalMUBUFImmOffset (CAddr->getZExtValue ()))
1611
+ return false ;
1612
+ if (!IsCopyFromSGPR (*TRI, Addr.getOperand (0 )))
1613
+ return false ;
1606
1614
1607
- // FIXME: Get from MachinePointerInfo? We should only be using the frame
1608
- // offset if we know this is in a call sequence.
1609
- SOffset = isStackPtrRelative (PtrInfo)
1610
- ? CurDAG->getRegister (Info->getStackPtrOffsetReg (), MVT::i32 )
1611
- : CurDAG->getTargetConstant (0 , DL, MVT::i32 );
1615
+ SOffset = Addr.getOperand (0 );
1616
+ } else if ((CAddr = dyn_cast<ConstantSDNode>(Addr)) &&
1617
+ SIInstrInfo::isLegalMUBUFImmOffset (CAddr->getZExtValue ())) {
1618
+ // <constant>
1619
+ SOffset = CurDAG->getTargetConstant (0 , DL, MVT::i32 );
1620
+ } else {
1621
+ return false ;
1622
+ }
1623
+
1624
+ SRsrc = CurDAG->getRegister (Info->getScratchRSrcReg (), MVT::v4i32);
1612
1625
1613
1626
Offset = CurDAG->getTargetConstant (CAddr->getZExtValue (), DL, MVT::i16 );
1614
1627
return true ;
@@ -1890,19 +1903,21 @@ static SDValue SelectSAddrFI(SelectionDAG *CurDAG, SDValue SAddr) {
1890
1903
}
1891
1904
1892
1905
// Match (32-bit SGPR base) + sext(imm offset)
1893
- bool AMDGPUDAGToDAGISel::SelectScratchSAddr (SDNode *N,
1894
- SDValue Addr,
1906
+ bool AMDGPUDAGToDAGISel::SelectScratchSAddr (SDNode *Parent, SDValue Addr,
1895
1907
SDValue &SAddr,
1896
1908
SDValue &Offset) const {
1897
1909
if (Addr->isDivergent ())
1898
1910
return false ;
1899
1911
1900
- SAddr = Addr;
1912
+ SDLoc DL (Addr);
1913
+
1901
1914
int64_t COffsetVal = 0 ;
1902
1915
1903
1916
if (CurDAG->isBaseWithConstantOffset (Addr)) {
1904
1917
COffsetVal = cast<ConstantSDNode>(Addr.getOperand (1 ))->getSExtValue ();
1905
1918
SAddr = Addr.getOperand (0 );
1919
+ } else {
1920
+ SAddr = Addr;
1906
1921
}
1907
1922
1908
1923
SAddr = SelectSAddrFI (CurDAG, SAddr);
@@ -1917,14 +1932,15 @@ bool AMDGPUDAGToDAGISel::SelectScratchSAddr(SDNode *N,
1917
1932
1918
1933
COffsetVal = SplitImmOffset;
1919
1934
1920
- SDLoc DL (N);
1921
1935
SDValue AddOffset =
1922
- getMaterializedScalarImm32 (Lo_32 (RemainderOffset), DL);
1936
+ SAddr.getOpcode () == ISD::TargetFrameIndex
1937
+ ? getMaterializedScalarImm32 (Lo_32 (RemainderOffset), DL)
1938
+ : CurDAG->getTargetConstant (RemainderOffset, DL, MVT::i32 );
1923
1939
SAddr = SDValue (CurDAG->getMachineNode (AMDGPU::S_ADD_U32, DL, MVT::i32 ,
1924
1940
SAddr, AddOffset), 0 );
1925
1941
}
1926
1942
1927
- Offset = CurDAG->getTargetConstant (COffsetVal, SDLoc () , MVT::i16 );
1943
+ Offset = CurDAG->getTargetConstant (COffsetVal, DL , MVT::i16 );
1928
1944
1929
1945
return true ;
1930
1946
}
0 commit comments