mirror of
https://github.com/RPCS3/llvm.git
synced 2025-04-02 13:21:43 +00:00
LivePhysRegs/IfConversion: Change some types from unsigned to MCPhysReg; NFC
Change the type in a couple of lists and sets that only store physical registers from unsigned to MCPhysRegs. The later is only 16bits and saves us a bit of memory. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@346254 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
68241312ac
commit
27ad7c20cc
@ -48,7 +48,8 @@ class raw_ostream;
|
||||
/// when walking backward/forward through a basic block.
|
||||
class LivePhysRegs {
|
||||
const TargetRegisterInfo *TRI = nullptr;
|
||||
SparseSet<unsigned> LiveRegs;
|
||||
using RegisterSet = SparseSet<MCPhysReg, identity<MCPhysReg>>;
|
||||
RegisterSet LiveRegs;
|
||||
|
||||
public:
|
||||
/// Constructs an unitialized set. init() needs to be called to initialize it.
|
||||
@ -76,7 +77,7 @@ public:
|
||||
bool empty() const { return LiveRegs.empty(); }
|
||||
|
||||
/// Adds a physical register and all its sub-registers to the set.
|
||||
void addReg(unsigned Reg) {
|
||||
void addReg(MCPhysReg Reg) {
|
||||
assert(TRI && "LivePhysRegs is not initialized.");
|
||||
assert(Reg <= TRI->getNumRegs() && "Expected a physical register.");
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
|
||||
@ -86,7 +87,7 @@ public:
|
||||
|
||||
/// Removes a physical register, all its sub-registers, and all its
|
||||
/// super-registers from the set.
|
||||
void removeReg(unsigned Reg) {
|
||||
void removeReg(MCPhysReg Reg) {
|
||||
assert(TRI && "LivePhysRegs is not initialized.");
|
||||
assert(Reg <= TRI->getNumRegs() && "Expected a physical register.");
|
||||
for (MCRegAliasIterator R(Reg, TRI, true); R.isValid(); ++R)
|
||||
@ -95,7 +96,7 @@ public:
|
||||
|
||||
/// Removes physical registers clobbered by the regmask operand \p MO.
|
||||
void removeRegsInMask(const MachineOperand &MO,
|
||||
SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> *Clobbers =
|
||||
SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> *Clobbers =
|
||||
nullptr);
|
||||
|
||||
/// Returns true if register \p Reg is contained in the set. This also
|
||||
@ -103,10 +104,10 @@ public:
|
||||
/// addReg() always adds all sub-registers to the set as well.
|
||||
/// Note: Returns false if just some sub registers are live, use available()
|
||||
/// when searching a free register.
|
||||
bool contains(unsigned Reg) const { return LiveRegs.count(Reg); }
|
||||
bool contains(MCPhysReg Reg) const { return LiveRegs.count(Reg); }
|
||||
|
||||
/// Returns true if register \p Reg and no aliasing register is in the set.
|
||||
bool available(const MachineRegisterInfo &MRI, unsigned Reg) const;
|
||||
bool available(const MachineRegisterInfo &MRI, MCPhysReg Reg) const;
|
||||
|
||||
/// Remove defined registers and regmask kills from the set.
|
||||
void removeDefs(const MachineInstr &MI);
|
||||
@ -126,7 +127,7 @@ public:
|
||||
/// defined or clobbered by a regmask. The operand will identify whether this
|
||||
/// is a regmask or register operand.
|
||||
void stepForward(const MachineInstr &MI,
|
||||
SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> &Clobbers);
|
||||
SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> &Clobbers);
|
||||
|
||||
/// Adds all live-in registers of basic block \p MBB.
|
||||
/// Live in registers are the registers in the blocks live-in list and the
|
||||
@ -143,7 +144,7 @@ public:
|
||||
/// registers.
|
||||
void addLiveOutsNoPristines(const MachineBasicBlock &MBB);
|
||||
|
||||
using const_iterator = SparseSet<unsigned>::const_iterator;
|
||||
using const_iterator = RegisterSet::const_iterator;
|
||||
|
||||
const_iterator begin() const { return LiveRegs.begin(); }
|
||||
const_iterator end() const { return LiveRegs.end(); }
|
||||
|
@ -85,14 +85,14 @@ public:
|
||||
bool empty() const { return Units.none(); }
|
||||
|
||||
/// Adds register units covered by physical register \p Reg.
|
||||
void addReg(unsigned Reg) {
|
||||
void addReg(MCPhysReg Reg) {
|
||||
for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit)
|
||||
Units.set(*Unit);
|
||||
}
|
||||
|
||||
/// Adds register units covered by physical register \p Reg that are
|
||||
/// part of the lanemask \p Mask.
|
||||
void addRegMasked(unsigned Reg, LaneBitmask Mask) {
|
||||
void addRegMasked(MCPhysReg Reg, LaneBitmask Mask) {
|
||||
for (MCRegUnitMaskIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
|
||||
LaneBitmask UnitMask = (*Unit).second;
|
||||
if (UnitMask.none() || (UnitMask & Mask).any())
|
||||
@ -101,7 +101,7 @@ public:
|
||||
}
|
||||
|
||||
/// Removes all register units covered by physical register \p Reg.
|
||||
void removeReg(unsigned Reg) {
|
||||
void removeReg(MCPhysReg Reg) {
|
||||
for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit)
|
||||
Units.reset(*Unit);
|
||||
}
|
||||
@ -115,7 +115,7 @@ public:
|
||||
void addRegsInMask(const uint32_t *RegMask);
|
||||
|
||||
/// Returns true if no part of physical register \p Reg is live.
|
||||
bool available(unsigned Reg) const {
|
||||
bool available(MCPhysReg Reg) const {
|
||||
for (MCRegUnitIterator Unit(Reg, TRI); Unit.isValid(); ++Unit) {
|
||||
if (Units.test(*Unit))
|
||||
return false;
|
||||
|
@ -273,7 +273,7 @@ namespace {
|
||||
void PredicateBlock(BBInfo &BBI,
|
||||
MachineBasicBlock::iterator E,
|
||||
SmallVectorImpl<MachineOperand> &Cond,
|
||||
SmallSet<unsigned, 4> *LaterRedefs = nullptr);
|
||||
SmallSet<MCPhysReg, 4> *LaterRedefs = nullptr);
|
||||
void CopyAndPredicateBlock(BBInfo &ToBBI, BBInfo &FromBBI,
|
||||
SmallVectorImpl<MachineOperand> &Cond,
|
||||
bool IgnoreBr = false);
|
||||
@ -1366,12 +1366,12 @@ static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {
|
||||
// Before stepping forward past MI, remember which regs were live
|
||||
// before MI. This is needed to set the Undef flag only when reg is
|
||||
// dead.
|
||||
SparseSet<unsigned> LiveBeforeMI;
|
||||
SparseSet<MCPhysReg, identity<MCPhysReg>> LiveBeforeMI;
|
||||
LiveBeforeMI.setUniverse(TRI->getNumRegs());
|
||||
for (unsigned Reg : Redefs)
|
||||
LiveBeforeMI.insert(Reg);
|
||||
|
||||
SmallVector<std::pair<unsigned, const MachineOperand*>, 4> Clobbers;
|
||||
SmallVector<std::pair<MCPhysReg, const MachineOperand*>, 4> Clobbers;
|
||||
Redefs.stepForward(MI, Clobbers);
|
||||
|
||||
// Now add the implicit uses for each of the clobbered values.
|
||||
@ -1740,7 +1740,7 @@ bool IfConverter::IfConvertDiamondCommon(
|
||||
|
||||
if (MRI->tracksLiveness()) {
|
||||
for (const MachineInstr &MI : make_range(MBB1.begin(), DI1)) {
|
||||
SmallVector<std::pair<unsigned, const MachineOperand*>, 4> Dummy;
|
||||
SmallVector<std::pair<MCPhysReg, const MachineOperand*>, 4> Dummy;
|
||||
Redefs.stepForward(MI, Dummy);
|
||||
}
|
||||
}
|
||||
@ -1806,13 +1806,13 @@ bool IfConverter::IfConvertDiamondCommon(
|
||||
// generate:
|
||||
// sub r0, r1, #1
|
||||
// addne r0, r1, #1
|
||||
SmallSet<unsigned, 4> RedefsByFalse;
|
||||
SmallSet<unsigned, 4> ExtUses;
|
||||
SmallSet<MCPhysReg, 4> RedefsByFalse;
|
||||
SmallSet<MCPhysReg, 4> ExtUses;
|
||||
if (TII->isProfitableToUnpredicate(MBB1, MBB2)) {
|
||||
for (const MachineInstr &FI : make_range(MBB2.begin(), DI2)) {
|
||||
if (FI.isDebugInstr())
|
||||
continue;
|
||||
SmallVector<unsigned, 4> Defs;
|
||||
SmallVector<MCPhysReg, 4> Defs;
|
||||
for (const MachineOperand &MO : FI.operands()) {
|
||||
if (!MO.isReg())
|
||||
continue;
|
||||
@ -1830,7 +1830,7 @@ bool IfConverter::IfConvertDiamondCommon(
|
||||
}
|
||||
}
|
||||
|
||||
for (unsigned Reg : Defs) {
|
||||
for (MCPhysReg Reg : Defs) {
|
||||
if (!ExtUses.count(Reg)) {
|
||||
for (MCSubRegIterator SubRegs(Reg, TRI, /*IncludeSelf=*/true);
|
||||
SubRegs.isValid(); ++SubRegs)
|
||||
@ -1976,7 +1976,7 @@ bool IfConverter::IfConvertDiamond(BBInfo &BBI, IfcvtKind Kind,
|
||||
}
|
||||
|
||||
static bool MaySpeculate(const MachineInstr &MI,
|
||||
SmallSet<unsigned, 4> &LaterRedefs) {
|
||||
SmallSet<MCPhysReg, 4> &LaterRedefs) {
|
||||
bool SawStore = true;
|
||||
if (!MI.isSafeToMove(nullptr, SawStore))
|
||||
return false;
|
||||
@ -1999,7 +1999,7 @@ static bool MaySpeculate(const MachineInstr &MI,
|
||||
void IfConverter::PredicateBlock(BBInfo &BBI,
|
||||
MachineBasicBlock::iterator E,
|
||||
SmallVectorImpl<MachineOperand> &Cond,
|
||||
SmallSet<unsigned, 4> *LaterRedefs) {
|
||||
SmallSet<MCPhysReg, 4> *LaterRedefs) {
|
||||
bool AnyUnpred = false;
|
||||
bool MaySpec = LaterRedefs != nullptr;
|
||||
for (MachineInstr &I : make_range(BBI.BB->begin(), E)) {
|
||||
|
@ -29,8 +29,8 @@ using namespace llvm;
|
||||
/// The clobbers set will be the list of live registers clobbered
|
||||
/// by the regmask.
|
||||
void LivePhysRegs::removeRegsInMask(const MachineOperand &MO,
|
||||
SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> *Clobbers) {
|
||||
SparseSet<unsigned>::iterator LRI = LiveRegs.begin();
|
||||
SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> *Clobbers) {
|
||||
RegisterSet::iterator LRI = LiveRegs.begin();
|
||||
while (LRI != LiveRegs.end()) {
|
||||
if (MO.clobbersPhysReg(*LRI)) {
|
||||
if (Clobbers)
|
||||
@ -83,7 +83,7 @@ void LivePhysRegs::stepBackward(const MachineInstr &MI) {
|
||||
/// on accurate kill flags. If possible use stepBackward() instead of this
|
||||
/// function.
|
||||
void LivePhysRegs::stepForward(const MachineInstr &MI,
|
||||
SmallVectorImpl<std::pair<unsigned, const MachineOperand*>> &Clobbers) {
|
||||
SmallVectorImpl<std::pair<MCPhysReg, const MachineOperand*>> &Clobbers) {
|
||||
// Remove killed registers from the set.
|
||||
for (ConstMIBundleOperands O(MI); O.isValid(); ++O) {
|
||||
if (O->isReg() && !O->isDebug()) {
|
||||
@ -142,7 +142,7 @@ LLVM_DUMP_METHOD void LivePhysRegs::dump() const {
|
||||
#endif
|
||||
|
||||
bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
|
||||
unsigned Reg) const {
|
||||
MCPhysReg Reg) const {
|
||||
if (LiveRegs.count(Reg))
|
||||
return false;
|
||||
if (MRI.isReserved(Reg))
|
||||
@ -157,7 +157,7 @@ bool LivePhysRegs::available(const MachineRegisterInfo &MRI,
|
||||
/// Add live-in registers of basic block \p MBB to \p LiveRegs.
|
||||
void LivePhysRegs::addBlockLiveIns(const MachineBasicBlock &MBB) {
|
||||
for (const auto &LI : MBB.liveins()) {
|
||||
unsigned Reg = LI.PhysReg;
|
||||
MCPhysReg Reg = LI.PhysReg;
|
||||
LaneBitmask Mask = LI.LaneMask;
|
||||
MCSubRegIndexIterator S(Reg, TRI);
|
||||
assert(Mask.any() && "Invalid livein mask");
|
||||
|
@ -1708,7 +1708,7 @@ bool HexagonFrameLowering::expandStoreVec2(MachineBasicBlock &B,
|
||||
// register that is entirely undefined.
|
||||
LivePhysRegs LPR(HRI);
|
||||
LPR.addLiveIns(B);
|
||||
SmallVector<std::pair<unsigned, const MachineOperand*>,2> Clobbers;
|
||||
SmallVector<std::pair<MCPhysReg, const MachineOperand*>,2> Clobbers;
|
||||
for (auto R = B.begin(); R != It; ++R) {
|
||||
Clobbers.clear();
|
||||
LPR.stepForward(*R, Clobbers);
|
||||
|
@ -392,7 +392,7 @@ void PPCExpandISEL::reorganizeBlockLayout(BlockISELList &BIL,
|
||||
// liveness state at the end of MBB (liveOut of MBB) as the liveIn for
|
||||
// NewSuccessor. Otherwise, will cause cyclic dependence.
|
||||
LivePhysRegs LPR(*MF->getSubtarget<PPCSubtarget>().getRegisterInfo());
|
||||
SmallVector<std::pair<unsigned, const MachineOperand *>, 2> Clobbers;
|
||||
SmallVector<std::pair<MCPhysReg, const MachineOperand *>, 2> Clobbers;
|
||||
for (MachineInstr &MI : *MBB)
|
||||
LPR.stepForward(MI, Clobbers);
|
||||
for (auto &LI : LPR)
|
||||
|
@ -2550,7 +2550,7 @@ void X86InstrInfo::replaceBranchWithTailCall(
|
||||
// call. This way they still appear live across the call.
|
||||
LivePhysRegs LiveRegs(getRegisterInfo());
|
||||
LiveRegs.addLiveOuts(MBB);
|
||||
SmallVector<std::pair<unsigned, const MachineOperand *>, 8> Clobbers;
|
||||
SmallVector<std::pair<MCPhysReg, const MachineOperand *>, 8> Clobbers;
|
||||
LiveRegs.stepForward(*MIB, Clobbers);
|
||||
for (const auto &C : Clobbers) {
|
||||
MIB.addReg(C.first, RegState::Implicit);
|
||||
|
Loading…
x
Reference in New Issue
Block a user