@@ -323,7 +323,7 @@ void RISCVFrameLowering::adjustStackForRVV(MachineFunction &MF,
323
323
// 2. SP = SP - RVV stack size
324
324
BuildMI (MBB, MBBI, DL, TII->get (Opc), SPReg)
325
325
.addReg (SPReg)
326
- .addReg (FactorRegister);
326
+ .addReg (FactorRegister, RegState::Kill );
327
327
}
328
328
329
329
void RISCVFrameLowering::emitPrologue (MachineFunction &MF,
@@ -385,7 +385,7 @@ void RISCVFrameLowering::emitPrologue(MachineFunction &MF,
385
385
386
386
// FIXME (note copied from Lanai): This appears to be overallocating. Needs
387
387
// investigation. Get the number of bytes to allocate from the FrameInfo.
388
- uint64_t StackSize = MFI.getStackSize ();
388
+ uint64_t StackSize = MFI.getStackSize () + RVFI-> getRVVPadding () ;
389
389
uint64_t RealStackSize = StackSize + RVFI->getLibCallStackSize ();
390
390
uint64_t RVVStackSize = RVFI->getRVVStackSize ();
391
391
@@ -560,7 +560,7 @@ void RISCVFrameLowering::emitEpilogue(MachineFunction &MF,
560
560
if (!CSI.empty ())
561
561
LastFrameDestroy = std::prev (MBBI, CSI.size ());
562
562
563
- uint64_t StackSize = MFI.getStackSize ();
563
+ uint64_t StackSize = MFI.getStackSize () + RVFI-> getRVVPadding () ;
564
564
uint64_t RealStackSize = StackSize + RVFI->getLibCallStackSize ();
565
565
uint64_t FPOffset = RealStackSize - RVFI->getVarArgsSaveSize ();
566
566
uint64_t RVVStackSize = RVFI->getRVVStackSize ();
@@ -637,48 +637,72 @@ RISCVFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
637
637
if (FirstSPAdjustAmount)
638
638
Offset += StackOffset::getFixed (FirstSPAdjustAmount);
639
639
else
640
- Offset += StackOffset::getFixed (MFI.getStackSize ());
640
+ Offset +=
641
+ StackOffset::getFixed (MFI.getStackSize () + RVFI->getRVVPadding ());
641
642
} else if (RI->needsStackRealignment (MF) && !MFI.isFixedObjectIndex (FI)) {
642
643
// If the stack was realigned, the frame pointer is set in order to allow
643
644
// SP to be restored, so we need another base register to record the stack
644
645
// after realignment.
645
646
if (hasBP (MF)) {
646
647
FrameReg = RISCVABI::getBPReg ();
647
648
// |--------------------------| -- <-- FP
648
- // | callee-saved registers | | <---------.
649
- // |--------------------------| -- |
650
- // | realignment (the size of | | |
651
- // | this area is not counted | | |
652
- // | in MFI.getStackSize()) | | |
653
- // |--------------------------| -- |-- MFI.getStackSize()
654
- // | RVV objects | | |
655
- // |--------------------------| -- |
656
- // | scalar local variables | | <---------'
649
+ // | callee-saved registers | | <----.
650
+ // |--------------------------| -- |
651
+ // | realignment (the size of | | |
652
+ // | this area is not counted | | |
653
+ // | in MFI.getStackSize()) | | |
654
+ // |--------------------------| -- |
655
+ // | Padding after RVV | | |
656
+ // | (not counted in | | |
657
+ // | MFI.getStackSize() | | |
658
+ // |--------------------------| -- |-- MFI.getStackSize()
659
+ // | RVV objects | | |
660
+ // | (not counted in | | |
661
+ // | MFI.getStackSize() | | |
662
+ // |--------------------------| -- |
663
+ // | Padding before RVV | | |
664
+ // | (not counted in | | |
665
+ // | MFI.getStackSize() | | |
666
+ // |--------------------------| -- |
667
+ // | scalar local variables | | <----'
657
668
// |--------------------------| -- <-- BP
658
669
// | VarSize objects | |
659
670
// |--------------------------| -- <-- SP
660
671
} else {
661
672
FrameReg = RISCV::X2;
662
673
// |--------------------------| -- <-- FP
663
- // | callee-saved registers | | <---------.
664
- // |--------------------------| -- |
665
- // | realignment (the size of | | |
666
- // | this area is not counted | | |
667
- // | in MFI.getStackSize()) | | |
668
- // |--------------------------| -- |-- MFI.getStackSize()
669
- // | RVV objects | | |
670
- // |--------------------------| -- |
671
- // | scalar local variables | | <---------'
674
+ // | callee-saved registers | | <----.
675
+ // |--------------------------| -- |
676
+ // | realignment (the size of | | |
677
+ // | this area is not counted | | |
678
+ // | in MFI.getStackSize()) | | |
679
+ // |--------------------------| -- |
680
+ // | Padding after RVV | | |
681
+ // | (not counted in | | |
682
+ // | MFI.getStackSize() | | |
683
+ // |--------------------------| -- |-- MFI.getStackSize()
684
+ // | RVV objects | | |
685
+ // | (not counted in | | |
686
+ // | MFI.getStackSize() | | |
687
+ // |--------------------------| -- |
688
+ // | Padding before RVV | | |
689
+ // | (not counted in | | |
690
+ // | MFI.getStackSize() | | |
691
+ // |--------------------------| -- |
692
+ // | scalar local variables | | <----'
672
693
// |--------------------------| -- <-- SP
673
694
}
695
+ // The total amount of padding surrounding RVV objects is described by
696
+ // RVV->getRVVPadding() and it can be zero. It allows us to align the RVV
697
+ // objects to 8 bytes.
674
698
if (MFI.getStackID (FI) == TargetStackID::Default) {
675
699
Offset += StackOffset::getFixed (MFI.getStackSize ());
676
700
if (FI < 0 )
677
701
Offset += StackOffset::getFixed (RVFI->getLibCallStackSize ());
678
702
} else if (MFI.getStackID (FI) == TargetStackID::ScalableVector) {
679
- Offset +=
680
- StackOffset::get (MFI.getStackSize () - RVFI->getCalleeSavedStackSize (),
681
- RVFI->getRVVStackSize ());
703
+ Offset += StackOffset::get (
704
+ alignTo (MFI.getStackSize () - RVFI->getCalleeSavedStackSize (), 8 ),
705
+ RVFI->getRVVStackSize ());
682
706
}
683
707
} else {
684
708
FrameReg = RI->getFrameRegister (MF);
@@ -704,20 +728,34 @@ RISCVFrameLowering::getFrameIndexReference(const MachineFunction &MF, int FI,
704
728
// When using SP to access frame objects, we need to add RVV stack size.
705
729
//
706
730
// |--------------------------| -- <-- FP
707
- // | callee-saved registers | |<--------.
708
- // |--------------------------| -- |
709
- // | RVV objects | | |-- MFI.getStackSize()
710
- // |--------------------------| -- |
711
- // | scalar local variables | |<--------'
731
+ // | callee-saved registers | | <----.
732
+ // |--------------------------| -- |
733
+ // | Padding after RVV | | |
734
+ // | (not counted in | | |
735
+ // | MFI.getStackSize() | | |
736
+ // |--------------------------| -- |
737
+ // | RVV objects | | |-- MFI.getStackSize()
738
+ // | (not counted in | | |
739
+ // | MFI.getStackSize() | | |
740
+ // |--------------------------| -- |
741
+ // | Padding before RVV | | |
742
+ // | (not counted in | | |
743
+ // | MFI.getStackSize() | | |
744
+ // |--------------------------| -- |
745
+ // | scalar local variables | | <----'
712
746
// |--------------------------| -- <-- SP
747
+ //
748
+ // The total amount of padding surrounding RVV objects is described by
749
+ // RVV->getRVVPadding() and it can be zero. It allows us to align the RVV
750
+ // objects to 8 bytes.
713
751
if (MFI.getStackID (FI) == TargetStackID::Default) {
714
752
Offset += StackOffset::getFixed (MFI.getStackSize ());
715
753
if (FI < 0 )
716
754
Offset += StackOffset::getFixed (RVFI->getLibCallStackSize ());
717
755
} else if (MFI.getStackID (FI) == TargetStackID::ScalableVector) {
718
- Offset += StackOffset::get (MFI. getStackSize () -
719
- RVFI->getCalleeSavedStackSize (),
720
- RVFI->getRVVStackSize ());
756
+ Offset += StackOffset::get (
757
+ alignTo (MFI. getStackSize () - RVFI->getCalleeSavedStackSize (), 8 ),
758
+ RVFI->getRVVStackSize ());
721
759
}
722
760
}
723
761
}
@@ -822,32 +860,29 @@ void RISCVFrameLowering::processFunctionBeforeFrameFinalized(
822
860
RegInfo->getSpillAlign (*RC), false );
823
861
RS->addScavengingFrameIndex (RegScavFI);
824
862
}
825
- }
826
863
827
- void RISCVFrameLowering::processFunctionBeforeFrameIndicesReplaced (
828
- MachineFunction &MF, RegScavenger *RS) const {
829
- auto *RVFI = MF.getInfo <RISCVMachineFunctionInfo>();
830
- const MachineFrameInfo &MFI = MF.getFrameInfo ();
831
864
if (MFI.getCalleeSavedInfo ().empty () || RVFI->useSaveRestoreLibCalls (MF)) {
832
865
RVFI->setCalleeSavedStackSize (0 );
833
866
return ;
834
867
}
835
868
836
- int64_t MinOffset = std::numeric_limits<int64_t >::max ();
837
- int64_t MaxOffset = std::numeric_limits<int64_t >::min ();
869
+ unsigned Size = 0 ;
838
870
for (const auto &Info : MFI.getCalleeSavedInfo ()) {
839
871
int FrameIdx = Info.getFrameIdx ();
840
872
if (MFI.getStackID (FrameIdx) != TargetStackID::Default)
841
873
continue ;
842
874
843
- int64_t Offset = MFI.getObjectOffset (FrameIdx);
844
- int64_t ObjSize = MFI.getObjectSize (FrameIdx);
845
- MinOffset = std::min<int64_t >(Offset, MinOffset);
846
- MaxOffset = std::max<int64_t >(Offset + ObjSize, MaxOffset);
875
+ Size += MFI.getObjectSize (FrameIdx);
847
876
}
848
-
849
- unsigned Size = alignTo (MaxOffset - MinOffset, 16 );
850
877
RVFI->setCalleeSavedStackSize (Size);
878
+
879
+ // Padding required to keep the RVV stack aligned to 8 bytes
880
+ // within the main stack. We only need this when not using FP.
881
+ if (RVVStackSize && !hasFP (MF) && Size % 8 != 0 ) {
882
+ // Because we add the padding to the size of the stack, adding
883
+ // getStackAlign() will keep it aligned.
884
+ RVFI->setRVVPadding (getStackAlign ().value ());
885
+ }
851
886
}
852
887
853
888
// Not preserve stack space within prologue for outgoing variables when the
0 commit comments