@@ -1275,7 +1275,7 @@ HexagonFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
1275
1275
unsigned FrameSize = MFI.getStackSize ();
1276
1276
Register SP = HRI.getStackRegister ();
1277
1277
Register FP = HRI.getFrameRegister ();
1278
- Register AP = HMFI.getStackAlignBasePhysReg ();
1278
+ Register AP = HMFI.getStackAlignBaseReg ();
1279
1279
// It may happen that AP will be absent even HasAlloca && HasExtraAlign
1280
1280
// is true. HasExtraAlign may be set because of vector spills, without
1281
1281
// aligned locals or aligned outgoing function arguments. Since vector
@@ -1290,9 +1290,6 @@ HexagonFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
1290
1290
// assume that missing AP will be replaced by FP.
1291
1291
// (A better fix would be to rematerialize AP from FP and always align
1292
1292
// vector spills.)
1293
- if (AP == 0 )
1294
- AP = FP;
1295
-
1296
1293
bool UseFP = false , UseAP = false ; // Default: use SP (except at -O0).
1297
1294
// Use FP at -O0, except when there are objects with extra alignment.
1298
1295
// That additional alignment requirement may cause a pad to be inserted,
@@ -1517,65 +1514,13 @@ void HexagonFrameLowering::processFunctionBeforeFrameFinalized(
1517
1514
if (!HasAlloca || !NeedsAlign)
1518
1515
return ;
1519
1516
1520
- SmallSet<int , 4 > DealignSlots;
1521
- unsigned LFS = MFI.getLocalFrameSize ();
1522
- for (int i = 0 , e = MFI.getObjectIndexEnd (); i != e; ++i) {
1523
- if (!MFI.isSpillSlotObjectIndex (i) || MFI.isDeadObjectIndex (i))
1524
- continue ;
1525
- unsigned S = MFI.getObjectSize (i);
1526
- // Reduce the alignment to at most 8. This will require unaligned vector
1527
- // stores if they happen here.
1528
- Align A = std::max (MFI.getObjectAlign (i), Align (8 ));
1529
- MFI.setObjectAlignment (i, Align (8 ));
1530
- LFS = alignTo (LFS+S, A);
1531
- MFI.mapLocalFrameObject (i, -static_cast <int64_t >(LFS));
1532
- DealignSlots.insert (i);
1533
- }
1534
-
1535
- MFI.setLocalFrameSize (LFS);
1536
- Align A = MFI.getLocalFrameMaxAlign ();
1537
- assert (A <= 8 && " Unexpected local frame alignment" );
1538
- if (A == 1 )
1539
- MFI.setLocalFrameMaxAlign (Align (8 ));
1540
- MFI.setUseLocalStackAllocationBlock (true );
1541
-
1542
- // Go over all MachineMemOperands in the code, and change the ones that
1543
- // refer to the dealigned stack slots to reflect the new alignment.
1544
- if (!DealignSlots.empty ()) {
1545
- for (MachineBasicBlock &BB : MF) {
1546
- for (MachineInstr &MI : BB) {
1547
- bool KeepOld = true ;
1548
- ArrayRef<MachineMemOperand*> memops = MI.memoperands ();
1549
- SmallVector<MachineMemOperand*,1 > new_memops;
1550
- for (MachineMemOperand *MMO : memops) {
1551
- auto *PV = MMO->getPseudoValue ();
1552
- if (auto *FS = dyn_cast_or_null<FixedStackPseudoSourceValue>(PV)) {
1553
- int FI = FS->getFrameIndex ();
1554
- if (DealignSlots.count (FI)) {
1555
- auto *NewMMO = MF.getMachineMemOperand (
1556
- MMO->getPointerInfo (), MMO->getFlags (), MMO->getSize (),
1557
- MFI.getObjectAlign (FI), MMO->getAAInfo (), MMO->getRanges (),
1558
- MMO->getSyncScopeID (), MMO->getSuccessOrdering (),
1559
- MMO->getFailureOrdering ());
1560
- new_memops.push_back (NewMMO);
1561
- KeepOld = false ;
1562
- continue ;
1563
- }
1564
- }
1565
- new_memops.push_back (MMO);
1566
- }
1567
- if (!KeepOld)
1568
- MI.setMemRefs (MF, new_memops);
1569
- }
1570
- }
1571
- }
1572
-
1573
1517
// Set the physical aligned-stack base address register.
1574
1518
Register AP = 0 ;
1575
1519
if (const MachineInstr *AI = getAlignaInstr (MF))
1576
1520
AP = AI->getOperand (0 ).getReg ();
1577
1521
auto &HMFI = *MF.getInfo <HexagonMachineFunctionInfo>();
1578
- HMFI.setStackAlignBasePhysReg (AP);
1522
+ assert (!AP.isValid () || AP.isPhysical ());
1523
+ HMFI.setStackAlignBaseReg (AP);
1579
1524
}
1580
1525
1581
1526
// / Returns true if there are no caller-saved registers available in class RC.
@@ -1637,6 +1582,26 @@ bool HexagonFrameLowering::assignCalleeSavedSpillSlots(MachineFunction &MF,
1637
1582
// (2) For each reserved register, remove that register and all of its
1638
1583
// sub- and super-registers from SRegs.
1639
1584
BitVector Reserved = TRI->getReservedRegs (MF);
1585
+ // Unreserve the stack align register: it is reserved for this function
1586
+ // only, it still needs to be saved/restored.
1587
+ Register AP =
1588
+ MF.getInfo <HexagonMachineFunctionInfo>()->getStackAlignBaseReg ();
1589
+ if (AP.isValid ()) {
1590
+ Reserved[AP] = false ;
1591
+ // Unreserve super-regs if no other subregisters are reserved.
1592
+ for (MCSuperRegIterator SP (AP, TRI, false ); SP.isValid (); ++SP) {
1593
+ bool HasResSub = false ;
1594
+ for (MCSubRegIterator SB (*SP, TRI, false ); SB.isValid (); ++SB) {
1595
+ if (!Reserved[*SB])
1596
+ continue ;
1597
+ HasResSub = true ;
1598
+ break ;
1599
+ }
1600
+ if (!HasResSub)
1601
+ Reserved[*SP] = false ;
1602
+ }
1603
+ }
1604
+
1640
1605
for (int x = Reserved.find_first (); x >= 0 ; x = Reserved.find_next (x)) {
1641
1606
Register R = x;
1642
1607
for (MCSuperRegIterator SR (R, TRI, true ); SR.isValid (); ++SR)
@@ -1936,21 +1901,16 @@ bool HexagonFrameLowering::expandStoreVec2(MachineBasicBlock &B,
1936
1901
Register SrcHi = HRI.getSubReg (SrcR, Hexagon::vsub_hi);
1937
1902
bool IsKill = MI->getOperand (2 ).isKill ();
1938
1903
int FI = MI->getOperand (0 ).getIndex ();
1939
- bool NeedsAligna = needsAligna (MF);
1940
1904
1941
1905
unsigned Size = HRI.getSpillSize (Hexagon::HvxVRRegClass);
1942
1906
Align NeedAlign = HRI.getSpillAlign (Hexagon::HvxVRRegClass);
1943
1907
Align HasAlign = MFI.getObjectAlign (FI);
1944
1908
unsigned StoreOpc;
1945
1909
1946
- auto UseAligned = [&](Align NeedAlign, Align HasAlign) {
1947
- return !NeedsAligna && (NeedAlign <= HasAlign);
1948
- };
1949
-
1950
1910
// Store low part.
1951
1911
if (LPR.contains (SrcLo)) {
1952
- StoreOpc = UseAligned ( NeedAlign, HasAlign) ? Hexagon::V6_vS32b_ai
1953
- : Hexagon::V6_vS32Ub_ai;
1912
+ StoreOpc = NeedAlign <= HasAlign ? Hexagon::V6_vS32b_ai
1913
+ : Hexagon::V6_vS32Ub_ai;
1954
1914
BuildMI (B, It, DL, HII.get (StoreOpc))
1955
1915
.addFrameIndex (FI)
1956
1916
.addImm (0 )
@@ -1960,8 +1920,8 @@ bool HexagonFrameLowering::expandStoreVec2(MachineBasicBlock &B,
1960
1920
1961
1921
// Store high part.
1962
1922
if (LPR.contains (SrcHi)) {
1963
- StoreOpc = UseAligned ( NeedAlign, HasAlign) ? Hexagon::V6_vS32b_ai
1964
- : Hexagon::V6_vS32Ub_ai;
1923
+ StoreOpc = NeedAlign <= HasAlign ? Hexagon::V6_vS32b_ai
1924
+ : Hexagon::V6_vS32Ub_ai;
1965
1925
BuildMI (B, It, DL, HII.get (StoreOpc))
1966
1926
.addFrameIndex (FI)
1967
1927
.addImm (Size)
@@ -1988,28 +1948,23 @@ bool HexagonFrameLowering::expandLoadVec2(MachineBasicBlock &B,
1988
1948
Register DstHi = HRI.getSubReg (DstR, Hexagon::vsub_hi);
1989
1949
Register DstLo = HRI.getSubReg (DstR, Hexagon::vsub_lo);
1990
1950
int FI = MI->getOperand (1 ).getIndex ();
1991
- bool NeedsAligna = needsAligna (MF);
1992
1951
1993
1952
unsigned Size = HRI.getSpillSize (Hexagon::HvxVRRegClass);
1994
1953
Align NeedAlign = HRI.getSpillAlign (Hexagon::HvxVRRegClass);
1995
1954
Align HasAlign = MFI.getObjectAlign (FI);
1996
1955
unsigned LoadOpc;
1997
1956
1998
- auto UseAligned = [&](Align NeedAlign, Align HasAlign) {
1999
- return !NeedsAligna && (NeedAlign <= HasAlign);
2000
- };
2001
-
2002
1957
// Load low part.
2003
- LoadOpc = UseAligned ( NeedAlign, HasAlign) ? Hexagon::V6_vL32b_ai
2004
- : Hexagon::V6_vL32Ub_ai;
1958
+ LoadOpc = NeedAlign <= HasAlign ? Hexagon::V6_vL32b_ai
1959
+ : Hexagon::V6_vL32Ub_ai;
2005
1960
BuildMI (B, It, DL, HII.get (LoadOpc), DstLo)
2006
1961
.addFrameIndex (FI)
2007
1962
.addImm (0 )
2008
1963
.cloneMemRefs (*MI);
2009
1964
2010
1965
// Load high part.
2011
- LoadOpc = UseAligned ( NeedAlign, HasAlign) ? Hexagon::V6_vL32b_ai
2012
- : Hexagon::V6_vL32Ub_ai;
1966
+ LoadOpc = NeedAlign <= HasAlign ? Hexagon::V6_vL32b_ai
1967
+ : Hexagon::V6_vL32Ub_ai;
2013
1968
BuildMI (B, It, DL, HII.get (LoadOpc), DstHi)
2014
1969
.addFrameIndex (FI)
2015
1970
.addImm (Size)
@@ -2028,7 +1983,6 @@ bool HexagonFrameLowering::expandStoreVec(MachineBasicBlock &B,
2028
1983
if (!MI->getOperand (0 ).isFI ())
2029
1984
return false ;
2030
1985
2031
- bool NeedsAligna = needsAligna (MF);
2032
1986
auto &HRI = *MF.getSubtarget <HexagonSubtarget>().getRegisterInfo ();
2033
1987
DebugLoc DL = MI->getDebugLoc ();
2034
1988
Register SrcR = MI->getOperand (2 ).getReg ();
@@ -2037,9 +1991,8 @@ bool HexagonFrameLowering::expandStoreVec(MachineBasicBlock &B,
2037
1991
2038
1992
Align NeedAlign = HRI.getSpillAlign (Hexagon::HvxVRRegClass);
2039
1993
Align HasAlign = MFI.getObjectAlign (FI);
2040
- bool UseAligned = !NeedsAligna && (NeedAlign <= HasAlign);
2041
- unsigned StoreOpc = UseAligned ? Hexagon::V6_vS32b_ai
2042
- : Hexagon::V6_vS32Ub_ai;
1994
+ unsigned StoreOpc = NeedAlign <= HasAlign ? Hexagon::V6_vS32b_ai
1995
+ : Hexagon::V6_vS32Ub_ai;
2043
1996
BuildMI (B, It, DL, HII.get (StoreOpc))
2044
1997
.addFrameIndex (FI)
2045
1998
.addImm (0 )
@@ -2059,17 +2012,15 @@ bool HexagonFrameLowering::expandLoadVec(MachineBasicBlock &B,
2059
2012
if (!MI->getOperand (1 ).isFI ())
2060
2013
return false ;
2061
2014
2062
- bool NeedsAligna = needsAligna (MF);
2063
2015
auto &HRI = *MF.getSubtarget <HexagonSubtarget>().getRegisterInfo ();
2064
2016
DebugLoc DL = MI->getDebugLoc ();
2065
2017
Register DstR = MI->getOperand (0 ).getReg ();
2066
2018
int FI = MI->getOperand (1 ).getIndex ();
2067
2019
2068
2020
Align NeedAlign = HRI.getSpillAlign (Hexagon::HvxVRRegClass);
2069
2021
Align HasAlign = MFI.getObjectAlign (FI);
2070
- bool UseAligned = !NeedsAligna && (NeedAlign <= HasAlign);
2071
- unsigned LoadOpc = UseAligned ? Hexagon::V6_vL32b_ai
2072
- : Hexagon::V6_vL32Ub_ai;
2022
+ unsigned LoadOpc = NeedAlign <= HasAlign ? Hexagon::V6_vL32b_ai
2023
+ : Hexagon::V6_vL32Ub_ai;
2073
2024
BuildMI (B, It, DL, HII.get (LoadOpc), DstR)
2074
2025
.addFrameIndex (FI)
2075
2026
.addImm (0 )
0 commit comments