mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-27 14:34:58 +00:00
Add MachineBasicBlock::addLiveIn().
This function adds a live-in physical register to an MBB and ensures that it is copied to a virtual register immediately. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@185594 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
62da588a2e
commit
f647652445
@ -296,6 +296,11 @@ public:
|
||||
/// is an error to add the same register to the same set more than once.
|
||||
void addLiveIn(unsigned Reg) { LiveIns.push_back(Reg); }
|
||||
|
||||
/// Add PhysReg as live in to this block, and ensure that there is a copy of
|
||||
/// PhysReg to a virtual register of class RC. Return the virtual register
|
||||
/// that is a copy of the live in PhysReg.
|
||||
unsigned addLiveIn(unsigned PhysReg, const TargetRegisterClass *RC);
|
||||
|
||||
/// removeLiveIn - Remove the specified register from the live in set.
|
||||
///
|
||||
void removeLiveIn(unsigned Reg);
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "llvm/CodeGen/LiveVariables.h"
|
||||
#include "llvm/CodeGen/MachineDominators.h"
|
||||
#include "llvm/CodeGen/MachineFunction.h"
|
||||
#include "llvm/CodeGen/MachineInstrBuilder.h"
|
||||
#include "llvm/CodeGen/MachineLoopInfo.h"
|
||||
#include "llvm/CodeGen/MachineRegisterInfo.h"
|
||||
#include "llvm/CodeGen/SlotIndexes.h"
|
||||
@ -341,6 +342,38 @@ bool MachineBasicBlock::isLiveIn(unsigned Reg) const {
|
||||
return I != livein_end();
|
||||
}
|
||||
|
||||
unsigned
|
||||
MachineBasicBlock::addLiveIn(unsigned PhysReg, const TargetRegisterClass *RC) {
|
||||
assert(getParent() && "MBB must be inserted in function");
|
||||
assert(TargetRegisterInfo::isPhysicalRegister(PhysReg) && "Expected physreg");
|
||||
assert(RC && "Register class is required");
|
||||
assert((isLandingPad() || this == &getParent()->front()) &&
|
||||
"Only the entry block and landing pads can have physreg live ins");
|
||||
|
||||
bool LiveIn = isLiveIn(PhysReg);
|
||||
iterator I = getFirstNonPHI(), E = end();
|
||||
MachineRegisterInfo &MRI = getParent()->getRegInfo();
|
||||
const TargetInstrInfo &TII = *getParent()->getTarget().getInstrInfo();
|
||||
|
||||
// Look for an existing copy.
|
||||
if (LiveIn)
|
||||
for (;I != E && I->isCopy(); ++I)
|
||||
if (I->getOperand(1).getReg() == PhysReg) {
|
||||
unsigned VirtReg = I->getOperand(0).getReg();
|
||||
if (!MRI.constrainRegClass(VirtReg, RC))
|
||||
llvm_unreachable("Incompatible live-in register class.");
|
||||
return VirtReg;
|
||||
}
|
||||
|
||||
// No luck, create a virtual register.
|
||||
unsigned VirtReg = MRI.createVirtualRegister(RC);
|
||||
BuildMI(*this, I, DebugLoc(), TII.get(TargetOpcode::COPY), VirtReg)
|
||||
.addReg(PhysReg, RegState::Kill);
|
||||
if (!LiveIn)
|
||||
addLiveIn(PhysReg);
|
||||
return VirtReg;
|
||||
}
|
||||
|
||||
void MachineBasicBlock::moveBefore(MachineBasicBlock *NewAfter) {
|
||||
getParent()->splice(NewAfter, this);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user