@@ -239,11 +239,6 @@ static cl::opt<bool> EnableRedZone("aarch64-redzone",
239
239
cl::desc (" enable use of redzone on AArch64" ),
240
240
cl::init(false ), cl::Hidden);
241
241
242
- static cl::opt<bool >
243
- ReverseCSRRestoreSeq (" reverse-csr-restore-seq" ,
244
- cl::desc (" reverse the CSR restore sequence" ),
245
- cl::init(false ), cl::Hidden);
246
-
247
242
static cl::opt<bool > StackTaggingMergeSetTag (
248
243
" stack-tagging-merge-settag" ,
249
244
cl::desc (" merge settag instruction in function epilog" ), cl::init(true ),
@@ -307,8 +302,6 @@ bool AArch64FrameLowering::homogeneousPrologEpilog(
307
302
return false ;
308
303
if (!EnableHomogeneousPrologEpilog)
309
304
return false ;
310
- if (ReverseCSRRestoreSeq)
311
- return false ;
312
305
if (EnableRedZone)
313
306
return false ;
314
307
@@ -3111,7 +3104,27 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
3111
3104
3112
3105
computeCalleeSaveRegisterPairs (MF, CSI, TRI, RegPairs, hasFP (MF));
3113
3106
3114
- auto EmitMI = [&](const RegPairInfo &RPI) -> MachineBasicBlock::iterator {
3107
+ if (homogeneousPrologEpilog (MF, &MBB)) {
3108
+ auto MIB = BuildMI (MBB, MBBI, DL, TII.get (AArch64::HOM_Epilog))
3109
+ .setMIFlag (MachineInstr::FrameDestroy);
3110
+ for (auto &RPI : RegPairs) {
3111
+ MIB.addReg (RPI.Reg1 , RegState::Define);
3112
+ MIB.addReg (RPI.Reg2 , RegState::Define);
3113
+ }
3114
+ return true ;
3115
+ }
3116
+
3117
+ // For performance reasons restore SVE register in increasing order
3118
+ auto IsPPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::PPR; };
3119
+ auto PPRBegin = std::find_if (RegPairs.begin (), RegPairs.end (), IsPPR);
3120
+ auto PPREnd = std::find_if (RegPairs.rbegin (), RegPairs.rend (), IsPPR);
3121
+ std::reverse (PPRBegin, PPREnd.base ());
3122
+ auto IsZPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::ZPR; };
3123
+ auto ZPRBegin = std::find_if (RegPairs.begin (), RegPairs.end (), IsZPR);
3124
+ auto ZPREnd = std::find_if (RegPairs.rbegin (), RegPairs.rend (), IsZPR);
3125
+ std::reverse (ZPRBegin, ZPREnd.base ());
3126
+
3127
+ for (const RegPairInfo &RPI : RegPairs) {
3115
3128
unsigned Reg1 = RPI.Reg1 ;
3116
3129
unsigned Reg2 = RPI.Reg2 ;
3117
3130
@@ -3185,43 +3198,6 @@ bool AArch64FrameLowering::restoreCalleeSavedRegisters(
3185
3198
MachineMemOperand::MOLoad, Size, Alignment));
3186
3199
if (NeedsWinCFI)
3187
3200
InsertSEH (MIB, TII, MachineInstr::FrameDestroy);
3188
-
3189
- return MIB->getIterator ();
3190
- };
3191
-
3192
- if (homogeneousPrologEpilog (MF, &MBB)) {
3193
- auto MIB = BuildMI (MBB, MBBI, DL, TII.get (AArch64::HOM_Epilog))
3194
- .setMIFlag (MachineInstr::FrameDestroy);
3195
- for (auto &RPI : RegPairs) {
3196
- MIB.addReg (RPI.Reg1 , RegState::Define);
3197
- MIB.addReg (RPI.Reg2 , RegState::Define);
3198
- }
3199
- return true ;
3200
- }
3201
-
3202
- // For performance reasons restore SVE register in increasing order
3203
- auto IsPPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::PPR; };
3204
- auto PPRBegin = std::find_if (RegPairs.begin (), RegPairs.end (), IsPPR);
3205
- auto PPREnd = std::find_if (RegPairs.rbegin (), RegPairs.rend (), IsPPR);
3206
- std::reverse (PPRBegin, PPREnd.base ());
3207
- auto IsZPR = [](const RegPairInfo &c) { return c.Type == RegPairInfo::ZPR; };
3208
- auto ZPRBegin = std::find_if (RegPairs.begin (), RegPairs.end (), IsZPR);
3209
- auto ZPREnd = std::find_if (RegPairs.rbegin (), RegPairs.rend (), IsZPR);
3210
- std::reverse (ZPRBegin, ZPREnd.base ());
3211
-
3212
- if (ReverseCSRRestoreSeq) {
3213
- MachineBasicBlock::iterator First = MBB.end ();
3214
- for (const RegPairInfo &RPI : reverse (RegPairs)) {
3215
- MachineBasicBlock::iterator It = EmitMI (RPI);
3216
- if (First == MBB.end ())
3217
- First = It;
3218
- }
3219
- if (First != MBB.end ())
3220
- MBB.splice (MBBI, &MBB, First);
3221
- } else {
3222
- for (const RegPairInfo &RPI : RegPairs) {
3223
- (void )EmitMI (RPI);
3224
- }
3225
3201
}
3226
3202
3227
3203
return true ;
0 commit comments