mirror of
https://github.com/RPCSX/llvm.git
synced 2024-11-23 11:49:50 +00:00
LiveRegUnits: Port recent LivePhysRegs bugfixes
Adjust code to look more like the code in LivePhysRegs and port over the fix for LivePhysRegs from r304001 and adapt to the new CSR management in MachineRegisterInfo. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@304622 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
5067e6a434
commit
70862df7eb
@ -198,13 +198,12 @@ void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
|
||||
}
|
||||
|
||||
void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
|
||||
const MachineFunction &MF = *MBB.getParent();
|
||||
if (!MBB.succ_empty()) {
|
||||
const MachineFunction &MF = *MBB.getParent();
|
||||
addPristines(*this, MF);
|
||||
addLiveOutsNoPristines(MBB);
|
||||
} else if (MBB.isReturnBlock()) {
|
||||
// For the return block: Add all callee saved registers.
|
||||
const MachineFunction &MF = *MBB.getParent();
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
if (MFI.isCalleeSavedInfoValid())
|
||||
addCalleeSavedRegs(*this, MF);
|
||||
|
@ -12,11 +12,13 @@
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
||||
#include "llvm/CodeGen/LiveRegUnits.h"
|
||||
|
||||
#include "llvm/CodeGen/MachineBasicBlock.h"
|
||||
#include "llvm/CodeGen/MachineFrameInfo.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBundle.h"
|
||||
#include "llvm/CodeGen/MachineOperand.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/MC/MCRegisterInfo.h"
|
||||
#include "llvm/Target/TargetRegisterInfo.h"
|
||||
|
||||
@ -81,46 +83,50 @@ void LiveRegUnits::accumulateBackward(const MachineInstr &MI) {
|
||||
}
|
||||
|
||||
/// Add live-in registers of basic block \p MBB to \p LiveUnits.
|
||||
static void addLiveIns(LiveRegUnits &LiveUnits, const MachineBasicBlock &MBB) {
|
||||
static void addBlockLiveIns(LiveRegUnits &LiveUnits,
|
||||
const MachineBasicBlock &MBB) {
|
||||
for (const auto &LI : MBB.liveins())
|
||||
LiveUnits.addRegMasked(LI.PhysReg, LI.LaneMask);
|
||||
}
|
||||
|
||||
static void addLiveOuts(LiveRegUnits &LiveUnits, const MachineBasicBlock &MBB) {
|
||||
// To get the live-outs we simply merge the live-ins of all successors.
|
||||
for (const MachineBasicBlock *Succ : MBB.successors())
|
||||
addLiveIns(LiveUnits, *Succ);
|
||||
/// Adds all callee saved registers to \p LiveUnits.
|
||||
static void addCalleeSavedRegs(LiveRegUnits &LiveUnits,
|
||||
const MachineFunction &MF) {
|
||||
const MachineRegisterInfo &MRI = MF.getRegInfo();
|
||||
for (const MCPhysReg *CSR = MRI.getCalleeSavedRegs(); CSR && *CSR; ++CSR)
|
||||
LiveUnits.addReg(*CSR);
|
||||
}
|
||||
|
||||
/// Add pristine registers to the given \p LiveUnits. This function removes
|
||||
/// actually saved callee save registers when \p InPrologueEpilogue is false.
|
||||
static void removeSavedRegs(LiveRegUnits &LiveUnits, const MachineFunction &MF,
|
||||
const MachineFrameInfo &MFI,
|
||||
const TargetRegisterInfo &TRI) {
|
||||
/// Adds pristine registers to the given \p LiveUnits. Pristine registers are
|
||||
/// callee saved registers that are unused in the function.
|
||||
static void addPristines(LiveRegUnits &LiveUnits, const MachineFunction &MF) {
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
if (!MFI.isCalleeSavedInfoValid())
|
||||
return;
|
||||
/// Add all callee saved regs, then remove the ones that are saved+restored.
|
||||
addCalleeSavedRegs(LiveUnits, MF);
|
||||
/// Remove the ones that are not saved/restored; they are pristine.
|
||||
for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
|
||||
LiveUnits.removeReg(Info.getReg());
|
||||
}
|
||||
|
||||
void LiveRegUnits::addLiveOuts(const MachineBasicBlock &MBB) {
|
||||
const MachineFunction &MF = *MBB.getParent();
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
if (MFI.isCalleeSavedInfoValid()) {
|
||||
for (const MCPhysReg *I = TRI->getCalleeSavedRegs(&MF); *I; ++I)
|
||||
addReg(*I);
|
||||
if (!MBB.isReturnBlock())
|
||||
removeSavedRegs(*this, MF, MFI, *TRI);
|
||||
if (!MBB.succ_empty()) {
|
||||
addPristines(*this, MF);
|
||||
// To get the live-outs we simply merge the live-ins of all successors.
|
||||
for (const MachineBasicBlock *Succ : MBB.successors())
|
||||
addBlockLiveIns(*this, *Succ);
|
||||
} else if (MBB.isReturnBlock()) {
|
||||
// For the return block: Add all callee saved registers.
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
if (MFI.isCalleeSavedInfoValid())
|
||||
addCalleeSavedRegs(*this, MF);
|
||||
}
|
||||
::addLiveOuts(*this, MBB);
|
||||
}
|
||||
|
||||
void LiveRegUnits::addLiveIns(const MachineBasicBlock &MBB) {
|
||||
const MachineFunction &MF = *MBB.getParent();
|
||||
const MachineFrameInfo &MFI = MF.getFrameInfo();
|
||||
if (MFI.isCalleeSavedInfoValid()) {
|
||||
for (const MCPhysReg *I = TRI->getCalleeSavedRegs(&MF); *I; ++I)
|
||||
addReg(*I);
|
||||
if (&MBB != &MF.front())
|
||||
removeSavedRegs(*this, MF, MFI, *TRI);
|
||||
}
|
||||
::addLiveIns(*this, MBB);
|
||||
addPristines(*this, MF);
|
||||
addBlockLiveIns(*this, MBB);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user