diff --git a/bolt/Passes/ShrinkWrapping.cpp b/bolt/Passes/ShrinkWrapping.cpp index 99afc5e4312c..abbc0fc6c6a5 100644 --- a/bolt/Passes/ShrinkWrapping.cpp +++ b/bolt/Passes/ShrinkWrapping.cpp @@ -696,6 +696,7 @@ void ShrinkWrapping::computeSaveLocations() { SavePos = std::vector>(BC.MRI->getNumRegs()); auto &RI = Info.getReachingInsnsBackwards(); auto &DA = Info.getDominatorAnalysis(); + auto &SPT = Info.getStackPointerTracking(); DEBUG(dbgs() << "Checking save/restore possibilities\n"); for (auto &BB : BF) { @@ -710,6 +711,12 @@ void ShrinkWrapping::computeSaveLocations() { if (RI.isInLoop(BB)) continue; + const auto SPFP = *SPT.getStateBefore(*First); + // If we don't know stack state at this point, bail + if ((SPFP.first == SPT.SUPERPOSITION || SPFP.first == SPT.EMPTY) && + (SPFP.second == SPT.SUPERPOSITION || SPFP.second == SPT.EMPTY)) + continue; + for (unsigned I = 0, E = BC.MRI->getNumRegs(); I != E; ++I) { if (!CSA.CalleeSaved[I]) continue; @@ -1144,9 +1151,15 @@ void ShrinkWrapping::moveSaveRestores() { auto FIELoad = CSA.LoadFIEByReg[I]; assert(FIESave && FIELoad); auto &SPT = Info.getStackPointerTracking(); - auto SaveOffset = SPT.getStateBefore(*BestPosSave)->first; + const auto SPFP = *SPT.getStateBefore(*BestPosSave); + auto SaveOffset = SPFP.first; auto SaveSize = FIESave->Size; + // If we don't know stack state at this point, bail + if ((SPFP.first == SPT.SUPERPOSITION || SPFP.first == SPT.EMPTY) && + (SPFP.second == SPT.SUPERPOSITION || SPFP.second == SPT.EMPTY)) + continue; + // Operation mode: if true, will insert push/pops instead of loads/restores bool UsePushPops = validatePushPopsMode(I, BestPosSave, SaveOffset); diff --git a/bolt/Passes/StackPointerTracking.h b/bolt/Passes/StackPointerTracking.h index ce0cd26bbc5e..46cc0facae61 100644 --- a/bolt/Passes/StackPointerTracking.h +++ b/bolt/Passes/StackPointerTracking.h @@ -123,8 +123,11 @@ protected: else FP = std::make_pair(0, 0); int64_t Output; - if (!MIA->evaluateSimple(Point, Output, SP, FP)) + if (!MIA->evaluateSimple(Point, Output, SP, FP)) { + if (SPVal == EMPTY && FPVal == EMPTY) + return SPVal; return SUPERPOSITION; + } return static_cast(Output); } @@ -155,8 +158,11 @@ protected: else SP = std::make_pair(0, 0); int64_t Output; - if (!MIA->evaluateSimple(Point, Output, SP, FP)) + if (!MIA->evaluateSimple(Point, Output, SP, FP)) { + if (SPVal == EMPTY && FPVal == EMPTY) + return FPVal; return SUPERPOSITION; + } if (!HasFramePointer) { if (MIA->escapesVariable(Point, *this->BC.MRI, false)) {