summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-09-08 16:29:50 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2017-09-08 16:29:50 +0000
commitf78eca8fb51660493862e7036641b8d2e53a14c8 (patch)
tree14cf2184c81c64f5a1cc8fdc4ec48bd277e52f02 /llvm/lib
parent1e30f07ce7a082f173d200e3a5706c0e31c67658 (diff)
downloadbcm5719-llvm-f78eca8fb51660493862e7036641b8d2e53a14c8.tar.gz
bcm5719-llvm-f78eca8fb51660493862e7036641b8d2e53a14c8.zip
Preserve existing regs when adding pristines to LivePhysRegs/LiveRegUnits
Differential Revision: https://reviews.llvm.org/D37600 llvm-svn: 312797
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/CodeGen/LivePhysRegs.cpp29
-rw-r--r--llvm/lib/CodeGen/LiveRegUnits.cpp28
2 files changed, 43 insertions, 14 deletions
diff --git a/llvm/lib/CodeGen/LivePhysRegs.cpp b/llvm/lib/CodeGen/LivePhysRegs.cpp
index ed05acfac4d..c3e46d3e0b8 100644
--- a/llvm/lib/CodeGen/LivePhysRegs.cpp
+++ b/llvm/lib/CodeGen/LivePhysRegs.cpp
@@ -166,17 +166,32 @@ static void addCalleeSavedRegs(LivePhysRegs &LiveRegs,
LiveRegs.addReg(*CSR);
}
-/// Adds pristine registers to the given \p LiveRegs. Pristine registers are
-/// callee saved registers that are unused in the function.
-static void addPristines(LivePhysRegs &LiveRegs, const MachineFunction &MF) {
+void LivePhysRegs::addPristines(const MachineFunction &MF) {
const MachineFrameInfo &MFI = MF.getFrameInfo();
if (!MFI.isCalleeSavedInfoValid())
return;
+ /// This function will usually be called on an empty object, handle this
+ /// as a special case.
+ if (empty()) {
+ /// Add all callee saved regs, then remove the ones that are saved and
+ /// restored.
+ addCalleeSavedRegs(*this, MF);
+ /// Remove the ones that are not saved/restored; they are pristine.
+ for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
+ removeReg(Info.getReg());
+ return;
+ }
+ /// If a callee-saved register that is not pristine is already present
+ /// in the set, we should make sure that it stays in it. Precompute the
+ /// set of pristine registers in a separate object.
/// Add all callee saved regs, then remove the ones that are saved+restored.
- addCalleeSavedRegs(LiveRegs, MF);
+ LivePhysRegs Pristine(*TRI);
+ addCalleeSavedRegs(Pristine, MF);
/// Remove the ones that are not saved/restored; they are pristine.
for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
- LiveRegs.removeReg(Info.getReg());
+ Pristine.removeReg(Info.getReg());
+ for (MCPhysReg R : Pristine)
+ addReg(R);
}
void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
@@ -201,7 +216,7 @@ void LivePhysRegs::addLiveOutsNoPristines(const MachineBasicBlock &MBB) {
void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
const MachineFunction &MF = *MBB.getParent();
if (!MBB.succ_empty()) {
- addPristines(*this, MF);
+ addPristines(MF);
addLiveOutsNoPristines(MBB);
} else if (MBB.isReturnBlock()) {
// For the return block: Add all callee saved registers.
@@ -213,7 +228,7 @@ void LivePhysRegs::addLiveOuts(const MachineBasicBlock &MBB) {
void LivePhysRegs::addLiveIns(const MachineBasicBlock &MBB) {
const MachineFunction &MF = *MBB.getParent();
- addPristines(*this, MF);
+ addPristines(MF);
addBlockLiveIns(MBB);
}
diff --git a/llvm/lib/CodeGen/LiveRegUnits.cpp b/llvm/lib/CodeGen/LiveRegUnits.cpp
index f9ba4ffa652..ec2c22071e4 100644
--- a/llvm/lib/CodeGen/LiveRegUnits.cpp
+++ b/llvm/lib/CodeGen/LiveRegUnits.cpp
@@ -97,23 +97,37 @@ static void addCalleeSavedRegs(LiveRegUnits &LiveUnits,
LiveUnits.addReg(*CSR);
}
-/// 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) {
+void LiveRegUnits::addPristines(const MachineFunction &MF) {
const MachineFrameInfo &MFI = MF.getFrameInfo();
if (!MFI.isCalleeSavedInfoValid())
return;
+ /// This function will usually be called on an empty object, handle this
+ /// as a special case.
+ if (empty()) {
+ /// Add all callee saved regs, then remove the ones that are saved and
+ /// restored.
+ addCalleeSavedRegs(*this, MF);
+ /// Remove the ones that are not saved/restored; they are pristine.
+ for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
+ removeReg(Info.getReg());
+ return;
+ }
+ /// If a callee-saved register that is not pristine is already present
+ /// in the set, we should make sure that it stays in it. Precompute the
+ /// set of pristine registers in a separate object.
/// Add all callee saved regs, then remove the ones that are saved+restored.
- addCalleeSavedRegs(LiveUnits, MF);
+ LiveRegUnits Pristine(*TRI);
+ addCalleeSavedRegs(Pristine, MF);
/// Remove the ones that are not saved/restored; they are pristine.
for (const CalleeSavedInfo &Info : MFI.getCalleeSavedInfo())
- LiveUnits.removeReg(Info.getReg());
+ Pristine.removeReg(Info.getReg());
+ addUnits(Pristine.getBitVector());
}
void LiveRegUnits::addLiveOuts(const MachineBasicBlock &MBB) {
const MachineFunction &MF = *MBB.getParent();
if (!MBB.succ_empty()) {
- addPristines(*this, MF);
+ addPristines(MF);
// To get the live-outs we simply merge the live-ins of all successors.
for (const MachineBasicBlock *Succ : MBB.successors())
addBlockLiveIns(*this, *Succ);
@@ -127,6 +141,6 @@ void LiveRegUnits::addLiveOuts(const MachineBasicBlock &MBB) {
void LiveRegUnits::addLiveIns(const MachineBasicBlock &MBB) {
const MachineFunction &MF = *MBB.getParent();
- addPristines(*this, MF);
+ addPristines(MF);
addBlockLiveIns(*this, MBB);
}
OpenPOWER on IntegriCloud