[llvm] r315089 - [PEI] Remove required properties and use 'if' instead of std::function
Reid Kleckner via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 6 11:21:20 PDT 2017
Author: rnk
Date: Fri Oct 6 11:21:19 2017
New Revision: 315089
URL: http://llvm.org/viewvc/llvm-project?rev=315089&view=rev
Log:
[PEI] Remove required properties and use 'if' instead of std::function
Summary:
After r303360, we initialize UsesCalleeSaves in runOnMachineFunction,
which runs after getRequiredProperties. UsesCalleeSaves was initialized
to 'false', so getRequiredProperties would always return an empty set.
We don't have a TargetMachine available early anymore after r303360.
Just removing the requirement of NoVRegs seems to make things work, so
let's do that.
Reviewers: thegameg, dschuff, MatzeB
Subscribers: hiraditya, llvm-commits
Differential Revision: https://reviews.llvm.org/D38597
Modified:
llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
Modified: llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp?rev=315089&r1=315088&r2=315089&view=diff
==============================================================================
--- llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp (original)
+++ llvm/trunk/lib/CodeGen/PrologEpilogInserter.cpp Fri Oct 6 11:21:19 2017
@@ -50,11 +50,11 @@ using namespace llvm;
#define DEBUG_TYPE "prologepilog"
typedef SmallVector<MachineBasicBlock *, 4> MBBVector;
-static void doSpillCalleeSavedRegs(MachineFunction &MF, RegScavenger *RS,
- unsigned &MinCSFrameIndex,
- unsigned &MaxCXFrameIndex,
- const MBBVector &SaveBlocks,
- const MBBVector &RestoreBlocks);
+static void spillCalleeSavedRegs(MachineFunction &MF, RegScavenger *RS,
+ unsigned &MinCSFrameIndex,
+ unsigned &MaxCXFrameIndex,
+ const MBBVector &SaveBlocks,
+ const MBBVector &RestoreBlocks);
namespace {
class PEI : public MachineFunctionPass {
@@ -66,29 +66,12 @@ public:
void getAnalysisUsage(AnalysisUsage &AU) const override;
- MachineFunctionProperties getRequiredProperties() const override {
- MachineFunctionProperties MFP;
- if (UsesCalleeSaves)
- MFP.set(MachineFunctionProperties::Property::NoVRegs);
- return MFP;
- }
-
/// runOnMachineFunction - Insert prolog/epilog code and replace abstract
/// frame indexes with appropriate references.
///
bool runOnMachineFunction(MachineFunction &Fn) override;
private:
- std::function<void(MachineFunction &MF, RegScavenger *RS,
- unsigned &MinCSFrameIndex, unsigned &MaxCSFrameIndex,
- const MBBVector &SaveBlocks,
- const MBBVector &RestoreBlocks)>
- SpillCalleeSavedRegisters;
- std::function<void(MachineFunction &MF, RegScavenger &RS)>
- ScavengeFrameVirtualRegs;
-
- bool UsesCalleeSaves = false;
-
RegScavenger *RS;
// MinCSFrameIndex, MaxCSFrameIndex - Keeps the range of callee saved
@@ -166,20 +149,6 @@ typedef SmallSetVector<int, 8> StackObjS
/// frame indexes with appropriate references.
///
bool PEI::runOnMachineFunction(MachineFunction &Fn) {
- if (!SpillCalleeSavedRegisters) {
- const TargetMachine &TM = Fn.getTarget();
- if (!TM.usesPhysRegsForPEI()) {
- SpillCalleeSavedRegisters = [](MachineFunction &, RegScavenger *,
- unsigned &, unsigned &, const MBBVector &,
- const MBBVector &) {};
- ScavengeFrameVirtualRegs = [](MachineFunction &, RegScavenger &) {};
- } else {
- SpillCalleeSavedRegisters = doSpillCalleeSavedRegs;
- ScavengeFrameVirtualRegs = scavengeFrameVirtualRegs;
- UsesCalleeSaves = true;
- }
- }
-
const Function* F = Fn.getFunction();
const TargetRegisterInfo *TRI = Fn.getSubtarget().getRegisterInfo();
const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering();
@@ -200,8 +169,9 @@ bool PEI::runOnMachineFunction(MachineFu
calculateSaveRestoreBlocks(Fn);
// Handle CSR spilling and restoring, for targets that need it.
- SpillCalleeSavedRegisters(Fn, RS, MinCSFrameIndex, MaxCSFrameIndex,
- SaveBlocks, RestoreBlocks);
+ if (Fn.getTarget().usesPhysRegsForPEI())
+ spillCalleeSavedRegs(Fn, RS, MinCSFrameIndex, MaxCSFrameIndex, SaveBlocks,
+ RestoreBlocks);
// Allow the target machine to make final modifications to the function
// before the frame layout is finalized.
@@ -226,12 +196,8 @@ bool PEI::runOnMachineFunction(MachineFu
// If register scavenging is needed, as we've enabled doing it as a
// post-pass, scavenge the virtual registers that frame index elimination
// inserted.
- if (TRI->requiresRegisterScavenging(Fn) && FrameIndexVirtualScavenging) {
- ScavengeFrameVirtualRegs(Fn, *RS);
-
- // Clear any vregs created by virtual scavenging.
- Fn.getRegInfo().clearVirtRegs();
- }
+ if (TRI->requiresRegisterScavenging(Fn) && FrameIndexVirtualScavenging)
+ scavengeFrameVirtualRegs(Fn, *RS);
// Warn on stack size when we exceeds the given limit.
MachineFrameInfo &MFI = Fn.getFrameInfo();
@@ -512,11 +478,19 @@ static void insertCSRRestores(MachineBas
}
}
-static void doSpillCalleeSavedRegs(MachineFunction &Fn, RegScavenger *RS,
- unsigned &MinCSFrameIndex,
- unsigned &MaxCSFrameIndex,
- const MBBVector &SaveBlocks,
- const MBBVector &RestoreBlocks) {
+static void spillCalleeSavedRegs(MachineFunction &Fn, RegScavenger *RS,
+ unsigned &MinCSFrameIndex,
+ unsigned &MaxCSFrameIndex,
+ const MBBVector &SaveBlocks,
+ const MBBVector &RestoreBlocks) {
+ // We can't list this requirement in getRequiredProperties because some
+ // targets (WebAssembly) use virtual registers past this point, and the pass
+ // pipeline is set up without giving the passes a chance to look at the
+ // TargetMachine.
+ // FIXME: Find a way to express this in getRequiredProperties.
+ assert(Fn.getProperties().hasProperty(
+ MachineFunctionProperties::Property::NoVRegs));
+
const Function *F = Fn.getFunction();
const TargetFrameLowering *TFI = Fn.getSubtarget().getFrameLowering();
MachineFrameInfo &MFI = Fn.getFrameInfo();
More information about the llvm-commits
mailing list