mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
- Change MachineInstr::findRegisterDefOperandIdx so it can also look for defs
that are aliases of the specified register. - Rename modifiesRegister to definesRegister since it's looking a def of the specific register or one of its super-registers. It's not looking for def of a sub-register or alias that could change the specified register. - Added modifiesRegister to look for defs of aliases. llvm-svn: 104377
This commit is contained in:
parent
0f1087b284
commit
3c850aecf6
@ -258,12 +258,19 @@ public:
|
||||
return findRegisterUseOperandIdx(Reg, true, TRI) != -1;
|
||||
}
|
||||
|
||||
/// modifiesRegister - Return true if the MachineInstr modifies the
|
||||
/// definesRegister - Return true if the MachineInstr fully defines the
|
||||
/// specified register. If TargetRegisterInfo is passed, then it also checks
|
||||
/// if there is a def of a super-register.
|
||||
bool modifiesRegister(unsigned Reg,
|
||||
const TargetRegisterInfo *TRI = NULL) const {
|
||||
return findRegisterDefOperandIdx(Reg, false, TRI) != -1;
|
||||
/// NOTE: It's ignoring subreg indices on virtual registers.
|
||||
bool definesRegister(unsigned Reg, const TargetRegisterInfo *TRI=NULL) const {
|
||||
return findRegisterDefOperandIdx(Reg, false, false, TRI) != -1;
|
||||
}
|
||||
|
||||
/// modifiesRegister - Return true if the MachineInstr modifies (fully define
|
||||
/// or partially define) the specified register.
|
||||
/// NOTE: It's ignoring subreg indices on virtual registers.
|
||||
bool modifiesRegister(unsigned Reg, const TargetRegisterInfo *TRI) const {
|
||||
return findRegisterDefOperandIdx(Reg, false, true, TRI) != -1;
|
||||
}
|
||||
|
||||
/// registerDefIsDead - Returns true if the register is dead in this machine
|
||||
@ -271,7 +278,7 @@ public:
|
||||
/// if there is a dead def of a super-register.
|
||||
bool registerDefIsDead(unsigned Reg,
|
||||
const TargetRegisterInfo *TRI = NULL) const {
|
||||
return findRegisterDefOperandIdx(Reg, true, TRI) != -1;
|
||||
return findRegisterDefOperandIdx(Reg, true, false, TRI) != -1;
|
||||
}
|
||||
|
||||
/// findRegisterUseOperandIdx() - Returns the operand index that is a use of
|
||||
@ -290,16 +297,18 @@ public:
|
||||
|
||||
/// findRegisterDefOperandIdx() - Returns the operand index that is a def of
|
||||
/// the specified register or -1 if it is not found. If isDead is true, defs
|
||||
/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it
|
||||
/// also checks if there is a def of a super-register.
|
||||
int findRegisterDefOperandIdx(unsigned Reg, bool isDead = false,
|
||||
/// that are not dead are skipped. If Overlap is true, then it also looks for
|
||||
/// defs that merely overlap the specified register. If TargetRegisterInfo is
|
||||
/// non-null, then it also checks if there is a def of a super-register.
|
||||
int findRegisterDefOperandIdx(unsigned Reg,
|
||||
bool isDead = false, bool Overlap = false,
|
||||
const TargetRegisterInfo *TRI = NULL) const;
|
||||
|
||||
/// findRegisterDefOperand - Wrapper for findRegisterDefOperandIdx, it returns
|
||||
/// a pointer to the MachineOperand rather than an index.
|
||||
MachineOperand *findRegisterDefOperand(unsigned Reg, bool isDead = false,
|
||||
const TargetRegisterInfo *TRI = NULL) {
|
||||
int Idx = findRegisterDefOperandIdx(Reg, isDead, TRI);
|
||||
int Idx = findRegisterDefOperandIdx(Reg, isDead, false, TRI);
|
||||
return (Idx == -1) ? NULL : &getOperand(Idx);
|
||||
}
|
||||
|
||||
|
@ -562,7 +562,7 @@ void LiveIntervals::handlePhysicalRegisterDef(MachineBasicBlock *MBB,
|
||||
end = baseIndex.getDefIndex();
|
||||
goto exit;
|
||||
} else {
|
||||
int DefIdx = mi->findRegisterDefOperandIdx(interval.reg, false, tri_);
|
||||
int DefIdx = mi->findRegisterDefOperandIdx(interval.reg,false,false,tri_);
|
||||
if (DefIdx != -1) {
|
||||
if (mi->isRegTiedToUseOperand(DefIdx)) {
|
||||
// Two-address instruction.
|
||||
@ -624,7 +624,7 @@ void LiveIntervals::handleRegisterDef(MachineBasicBlock *MBB,
|
||||
for (const unsigned* AS = tri_->getSubRegisters(MO.getReg()); *AS; ++AS)
|
||||
// If MI also modifies the sub-register explicitly, avoid processing it
|
||||
// more than once. Do not pass in TRI here so it checks for exact match.
|
||||
if (!MI->modifiesRegister(*AS))
|
||||
if (!MI->definesRegister(*AS))
|
||||
handlePhysicalRegisterDef(MBB, MI, MIIdx, MO,
|
||||
getOrCreateInterval(*AS), 0);
|
||||
}
|
||||
@ -665,7 +665,7 @@ void LiveIntervals::handleLiveInRegister(MachineBasicBlock *MBB,
|
||||
end = baseIndex.getDefIndex();
|
||||
SeenDefUse = true;
|
||||
break;
|
||||
} else if (mi->modifiesRegister(interval.reg, tri_)) {
|
||||
} else if (mi->definesRegister(interval.reg, tri_)) {
|
||||
// Another instruction redefines the register before it is ever read.
|
||||
// Then the register is essentially dead at the instruction that defines
|
||||
// it. Hence its interval is:
|
||||
|
@ -813,20 +813,25 @@ MachineInstr::readsWritesVirtualRegister(unsigned Reg,
|
||||
/// the specified register or -1 if it is not found. If isDead is true, defs
|
||||
/// that are not dead are skipped. If TargetRegisterInfo is non-null, then it
|
||||
/// also checks if there is a def of a super-register.
|
||||
int MachineInstr::findRegisterDefOperandIdx(unsigned Reg, bool isDead,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
int
|
||||
MachineInstr::findRegisterDefOperandIdx(unsigned Reg, bool isDead, bool Overlap,
|
||||
const TargetRegisterInfo *TRI) const {
|
||||
bool isPhys = TargetRegisterInfo::isPhysicalRegister(Reg);
|
||||
for (unsigned i = 0, e = getNumOperands(); i != e; ++i) {
|
||||
const MachineOperand &MO = getOperand(i);
|
||||
if (!MO.isReg() || !MO.isDef())
|
||||
continue;
|
||||
unsigned MOReg = MO.getReg();
|
||||
if (MOReg == Reg ||
|
||||
(TRI &&
|
||||
TargetRegisterInfo::isPhysicalRegister(MOReg) &&
|
||||
TargetRegisterInfo::isPhysicalRegister(Reg) &&
|
||||
TRI->isSubRegister(MOReg, Reg)))
|
||||
if (!isDead || MO.isDead())
|
||||
return i;
|
||||
bool Found = (MOReg == Reg);
|
||||
if (!Found && TRI && isPhys &&
|
||||
TargetRegisterInfo::isPhysicalRegister(MOReg)) {
|
||||
if (Overlap)
|
||||
Found = TRI->regsOverlap(MOReg, Reg);
|
||||
else
|
||||
Found = TRI->isSubRegister(MOReg, Reg);
|
||||
}
|
||||
if (Found && (!isDead || MO.isDead()))
|
||||
return i;
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
@ -197,13 +197,13 @@ static bool isSchedulingBoundary(const MachineInstr *MI,
|
||||
if (MI->getDesc().isTerminator() || MI->isLabel())
|
||||
return true;
|
||||
|
||||
// Don't attempt to schedule around any instruction that modifies
|
||||
// Don't attempt to schedule around any instruction that defines
|
||||
// a stack-oriented pointer, as it's unlikely to be profitable. This
|
||||
// saves compile time, because it doesn't require every single
|
||||
// stack slot reference to depend on the instruction that does the
|
||||
// modification.
|
||||
const TargetLowering &TLI = *MF.getTarget().getTargetLowering();
|
||||
if (MI->modifiesRegister(TLI.getStackPointerRegisterToSaveRestore()))
|
||||
if (MI->definesRegister(TLI.getStackPointerRegisterToSaveRestore()))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
@ -882,7 +882,7 @@ MachineInstr* PreAllocSplitting::FoldSpill(unsigned vreg,
|
||||
!RefsInMBB.count(FoldPt))
|
||||
--FoldPt;
|
||||
|
||||
int OpIdx = FoldPt->findRegisterDefOperandIdx(vreg, false);
|
||||
int OpIdx = FoldPt->findRegisterDefOperandIdx(vreg);
|
||||
if (OpIdx == -1)
|
||||
return 0;
|
||||
|
||||
|
@ -626,7 +626,8 @@ SimpleRegisterCoalescing::TrimLiveIntervalToLastUse(SlotIndex CopyIdx,
|
||||
if (tii_->isMoveInstr(*LastUseMI, SrcReg, DstReg, SrcSubIdx, DstSubIdx) &&
|
||||
DstReg == li.reg && DstSubIdx == 0) {
|
||||
// Last use is itself an identity code.
|
||||
int DeadIdx = LastUseMI->findRegisterDefOperandIdx(li.reg, false, tri_);
|
||||
int DeadIdx = LastUseMI->findRegisterDefOperandIdx(li.reg,
|
||||
false, false, tri_);
|
||||
LastUseMI->getOperand(DeadIdx).setIsDead();
|
||||
}
|
||||
return true;
|
||||
@ -949,7 +950,7 @@ static void PropagateDeadness(LiveInterval &li, MachineInstr *CopyMI,
|
||||
MachineInstr *DefMI =
|
||||
li_->getInstructionFromIndex(LRStart.getDefIndex());
|
||||
if (DefMI && DefMI != CopyMI) {
|
||||
int DeadIdx = DefMI->findRegisterDefOperandIdx(li.reg, false);
|
||||
int DeadIdx = DefMI->findRegisterDefOperandIdx(li.reg);
|
||||
if (DeadIdx != -1)
|
||||
DefMI->getOperand(DeadIdx).setIsDead();
|
||||
else
|
||||
|
@ -780,7 +780,7 @@ canUpdateDeletedKills(SmallVector<unsigned, 4> &Kills,
|
||||
if (!LastKill)
|
||||
return false;
|
||||
|
||||
bool isModRef = LastKill->modifiesRegister(Kill);
|
||||
bool isModRef = LastKill->definesRegister(Kill);
|
||||
NewKills.push_back(std::make_pair(std::make_pair(Kill, isModRef),
|
||||
LastKill));
|
||||
}
|
||||
|
@ -916,7 +916,7 @@ bool X86FastISel::X86SelectBranch(const Instruction *I) {
|
||||
RI = MBB->rbegin(), RE = MBB->rend(); RI != RE; ++RI) {
|
||||
const MachineInstr &MI = *RI;
|
||||
|
||||
if (MI.modifiesRegister(Reg)) {
|
||||
if (MI.definesRegister(Reg)) {
|
||||
unsigned Src, Dst, SrcSR, DstSR;
|
||||
|
||||
if (getInstrInfo()->isMoveInstr(MI, Src, Dst, SrcSR, DstSR)) {
|
||||
|
Loading…
Reference in New Issue
Block a user