Skip to content

Commit 073db22

Browse files
committed
Revert "[NativeAOT/ARM64] Generate frames compatible with Apple compact unwinding (dotnet#111451)"
This reverts commit 9031940.
1 parent d917005 commit 073db22

File tree

9 files changed

+93
-337
lines changed

9 files changed

+93
-337
lines changed

src/coreclr/jit/codegen.h

-1
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,6 @@ class CodeGen final : public CodeGenInterface
659659
virtual bool IsSaveFpLrWithAllCalleeSavedRegisters() const;
660660
bool genSaveFpLrWithAllCalleeSavedRegisters;
661661
bool genForceFuncletFrameType5;
662-
bool genReverseAndPairCalleeSavedRegisters;
663662
#endif // TARGET_ARM64
664663

665664
//-------------------------------------------------------------------------

src/coreclr/jit/codegenarm64.cpp

+8-38
Original file line numberDiff line numberDiff line change
@@ -845,19 +845,12 @@ void CodeGen::genSaveCalleeSavedRegisterGroup(regMaskTP regsMask, int spDelta, i
845845

846846
for (int i = 0; i < regStack.Height(); ++i)
847847
{
848-
RegPair regPair = genReverseAndPairCalleeSavedRegisters ? regStack.Top(i) : regStack.Bottom(i);
848+
RegPair regPair = regStack.Bottom(i);
849849
if (regPair.reg2 != REG_NA)
850850
{
851851
// We can use a STP instruction.
852-
if (genReverseAndPairCalleeSavedRegisters)
853-
{
854-
genPrologSaveRegPair(regPair.reg2, regPair.reg1, spOffset, spDelta, false, REG_IP0, nullptr);
855-
}
856-
else
857-
{
858-
genPrologSaveRegPair(regPair.reg1, regPair.reg2, spOffset, spDelta, regPair.useSaveNextPair, REG_IP0,
859-
nullptr);
860-
}
852+
genPrologSaveRegPair(regPair.reg1, regPair.reg2, spOffset, spDelta, regPair.useSaveNextPair, REG_IP0,
853+
nullptr);
861854

862855
spOffset += 2 * slotSize;
863856
}
@@ -933,9 +926,8 @@ void CodeGen::genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowe
933926

934927
// Save integer registers at higher addresses than floating-point registers.
935928

936-
regMaskTP maskSaveRegsFrame = regsToSaveMask & (RBM_FP | RBM_LR);
937929
regMaskTP maskSaveRegsFloat = regsToSaveMask & RBM_ALLFLOAT;
938-
regMaskTP maskSaveRegsInt = regsToSaveMask & ~maskSaveRegsFloat & ~maskSaveRegsFrame;
930+
regMaskTP maskSaveRegsInt = regsToSaveMask & ~maskSaveRegsFloat;
939931

940932
if (maskSaveRegsFloat != RBM_NONE)
941933
{
@@ -947,13 +939,6 @@ void CodeGen::genSaveCalleeSavedRegistersHelp(regMaskTP regsToSaveMask, int lowe
947939
if (maskSaveRegsInt != RBM_NONE)
948940
{
949941
genSaveCalleeSavedRegisterGroup(maskSaveRegsInt, spDelta, lowestCalleeSavedOffset);
950-
spDelta = 0;
951-
lowestCalleeSavedOffset += genCountBits(maskSaveRegsInt) * FPSAVE_REGSIZE_BYTES;
952-
}
953-
954-
if (maskSaveRegsFrame != RBM_NONE)
955-
{
956-
genPrologSaveRegPair(REG_FP, REG_LR, lowestCalleeSavedOffset, spDelta, false, REG_IP0, nullptr);
957942
// No need to update spDelta, lowestCalleeSavedOffset since they're not used after this.
958943
}
959944
}
@@ -985,20 +970,13 @@ void CodeGen::genRestoreCalleeSavedRegisterGroup(regMaskTP regsMask, int spDelta
985970
stackDelta = spDelta;
986971
}
987972

988-
RegPair regPair = genReverseAndPairCalleeSavedRegisters ? regStack.Bottom(i) : regStack.Top(i);
973+
RegPair regPair = regStack.Top(i);
989974
if (regPair.reg2 != REG_NA)
990975
{
991976
spOffset -= 2 * slotSize;
992977

993-
if (genReverseAndPairCalleeSavedRegisters)
994-
{
995-
genEpilogRestoreRegPair(regPair.reg2, regPair.reg1, spOffset, stackDelta, false, REG_IP1, nullptr);
996-
}
997-
else
998-
{
999-
genEpilogRestoreRegPair(regPair.reg1, regPair.reg2, spOffset, stackDelta, regPair.useSaveNextPair,
1000-
REG_IP1, nullptr);
1001-
}
978+
genEpilogRestoreRegPair(regPair.reg1, regPair.reg2, spOffset, stackDelta, regPair.useSaveNextPair, REG_IP1,
979+
nullptr);
1002980
}
1003981
else
1004982
{
@@ -1065,19 +1043,11 @@ void CodeGen::genRestoreCalleeSavedRegistersHelp(regMaskTP regsToRestoreMask, in
10651043

10661044
// Save integer registers at higher addresses than floating-point registers.
10671045

1068-
regMaskTP maskRestoreRegsFrame = regsToRestoreMask & (RBM_FP | RBM_LR);
10691046
regMaskTP maskRestoreRegsFloat = regsToRestoreMask & RBM_ALLFLOAT;
1070-
regMaskTP maskRestoreRegsInt = regsToRestoreMask & ~maskRestoreRegsFloat & ~maskRestoreRegsFrame;
1047+
regMaskTP maskRestoreRegsInt = regsToRestoreMask & ~maskRestoreRegsFloat;
10711048

10721049
// Restore in the opposite order of saving.
10731050

1074-
if (maskRestoreRegsFrame != RBM_NONE)
1075-
{
1076-
int spFrameDelta = (maskRestoreRegsFloat != RBM_NONE || maskRestoreRegsInt != RBM_NONE) ? 0 : spDelta;
1077-
spOffset -= 2 * REGSIZE_BYTES;
1078-
genEpilogRestoreRegPair(REG_FP, REG_LR, spOffset, spFrameDelta, false, REG_IP1, nullptr);
1079-
}
1080-
10811051
if (maskRestoreRegsInt != RBM_NONE)
10821052
{
10831053
int spIntDelta = (maskRestoreRegsFloat != RBM_NONE) ? 0 : spDelta; // should we delay the SP adjustment?

src/coreclr/jit/codegencommon.cpp

-24
Original file line numberDiff line numberDiff line change
@@ -255,7 +255,6 @@ CodeGen::CodeGen(Compiler* theCompiler)
255255
#ifdef TARGET_ARM64
256256
genSaveFpLrWithAllCalleeSavedRegisters = false;
257257
genForceFuncletFrameType5 = false;
258-
genReverseAndPairCalleeSavedRegisters = false;
259258
#endif // TARGET_ARM64
260259
}
261260

@@ -4813,29 +4812,6 @@ void CodeGen::genFinalizeFrame()
48134812
}
48144813
#endif // TARGET_ARM
48154814

4816-
#ifdef TARGET_ARM64
4817-
if (compiler->IsTargetAbi(CORINFO_NATIVEAOT_ABI) && TargetOS::IsApplePlatform)
4818-
{
4819-
JITDUMP("Setting genReverseAndPairCalleeSavedRegisters = true");
4820-
4821-
genReverseAndPairCalleeSavedRegisters = true;
4822-
4823-
// Make sure we push the registers in pairs if possible. If we only allocate a contiguous
4824-
// block of registers this should add at most one integer and at most one floating point
4825-
// register to the list. The stack has to be 16-byte aligned, so in worst case it results
4826-
// in allocating 16 bytes more space on stack if odd number of integer and odd number of
4827-
// FP registers were occupied. Same number of instructions will be generated, just the
4828-
// STR instructions are replaced with STP (store pair).
4829-
regMaskTP maskModifiedRegs = regSet.rsGetModifiedRegsMask();
4830-
regMaskTP maskPairRegs = ((maskModifiedRegs & (RBM_V8 | RBM_V10 | RBM_V12 | RBM_V14)).getLow() << 1) |
4831-
((maskModifiedRegs & (RBM_R19 | RBM_R21 | RBM_R23 | RBM_R25 | RBM_R27)).getLow() << 1);
4832-
if (maskPairRegs != RBM_NONE)
4833-
{
4834-
regSet.rsSetRegsModified(maskPairRegs);
4835-
}
4836-
}
4837-
#endif
4838-
48394815
#ifdef DEBUG
48404816
if (verbose)
48414817
{

src/coreclr/jit/compiler.h

-2
Original file line numberDiff line numberDiff line change
@@ -4324,8 +4324,6 @@ class Compiler
43244324

43254325
#ifdef TARGET_ARM
43264326
int lvaFrameAddress(int varNum, bool mustBeFPBased, regNumber* pBaseReg, int addrModeOffset, bool isFloatUsage);
4327-
#elif TARGET_ARM64
4328-
int lvaFrameAddress(int varNum, bool* pFPbased, bool suppressFPtoSPRewrite = false);
43294327
#else
43304328
int lvaFrameAddress(int varNum, bool* pFPbased);
43314329
#endif

src/coreclr/jit/compiler.hpp

-13
Original file line numberDiff line numberDiff line change
@@ -2639,9 +2639,6 @@ inline
26392639
int
26402640
Compiler::lvaFrameAddress(
26412641
int varNum, bool mustBeFPBased, regNumber* pBaseReg, int addrModeOffset, bool isFloatUsage)
2642-
#elif TARGET_ARM64
2643-
int
2644-
Compiler::lvaFrameAddress(int varNum, bool* pFPbased, bool suppressFPtoSPRewrite)
26452642
#else
26462643
int
26472644
Compiler::lvaFrameAddress(int varNum, bool* pFPbased)
@@ -2811,16 +2808,6 @@ inline
28112808
{
28122809
*pBaseReg = REG_SPBASE;
28132810
}
2814-
#elif defined(TARGET_ARM64)
2815-
if (FPbased && !suppressFPtoSPRewrite && !codeGen->isFramePointerRequired() && varOffset < 0 && !opts.IsOSR() &&
2816-
lvaDoneFrameLayout == Compiler::FINAL_FRAME_LAYOUT && codeGen->IsSaveFpLrWithAllCalleeSavedRegisters())
2817-
{
2818-
int spVarOffset = varOffset + codeGen->genSPtoFPdelta();
2819-
JITDUMP("lvaFrameAddress optimization for V%02u: [FP-%d] -> [SP+%d]\n", varNum, -varOffset, spVarOffset);
2820-
FPbased = false;
2821-
varOffset = spVarOffset;
2822-
}
2823-
*pFPbased = FPbased;
28242811
#else
28252812
*pFPbased = FPbased;
28262813
#endif

src/coreclr/jit/emitarm64.cpp

+7-3
Original file line numberDiff line numberDiff line change
@@ -12270,7 +12270,7 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
1227012270
int varNum = id->idAddr()->iiaLclVar.lvaVarNum();
1227112271
unsigned ofs = AlignDown(id->idAddr()->iiaLclVar.lvaOffset(), TARGET_POINTER_SIZE);
1227212272
bool FPbased;
12273-
int adr = emitComp->lvaFrameAddress(varNum, &FPbased, true);
12273+
int adr = emitComp->lvaFrameAddress(varNum, &FPbased);
1227412274
if (id->idGCref() != GCT_NONE)
1227512275
{
1227612276
emitGCvarLiveUpd(adr + ofs, varNum, id->idGCref(), dst DEBUG_ARG(varNum));
@@ -12311,11 +12311,15 @@ size_t emitter::emitOutputInstr(insGroup* ig, instrDesc* id, BYTE** dp)
1231112311

1231212312
// If there are 2 GC vars in this instrDesc, get the 2nd variable
1231312313
// that should be tracked.
12314-
adr2 = emitComp->lvaFrameAddress(varNum2, &FPbased2, true);
12314+
adr2 = emitComp->lvaFrameAddress(varNum2, &FPbased2);
1231512315
ofs2Dist = EA_SIZE_IN_BYTES(size);
1231612316
#ifdef DEBUG
1231712317
assert(FPbased == FPbased2);
12318-
if (!FPbased)
12318+
if (FPbased)
12319+
{
12320+
assert(id->idReg3() == REG_FP);
12321+
}
12322+
else
1231912323
{
1232012324
assert(encodingZRtoSP(id->idReg3()) == REG_SP);
1232112325
}

0 commit comments

Comments
 (0)