mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-26 10:29:36 +00:00
Revert the kludge in 76703. I got a clean
bootstrap of FSF-style PPC, so there is some reason to believe the original bug (which was never analyzed) has been fixed, probably by 82266. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@83871 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
c1deda50ca
commit
3a6b9eb868
@ -449,10 +449,6 @@ public:
|
||||
return true;
|
||||
}
|
||||
|
||||
/// isDeadInstruction - Return true if the instruction is considered dead.
|
||||
/// This allows some late codegen passes to delete them.
|
||||
virtual bool isDeadInstruction(const MachineInstr *MI) const = 0;
|
||||
|
||||
/// GetInstSize - Returns the size of the specified Instruction.
|
||||
///
|
||||
virtual unsigned GetInstSizeInBytes(const MachineInstr *MI) const {
|
||||
@ -490,8 +486,6 @@ public:
|
||||
MachineBasicBlock::iterator MI,
|
||||
unsigned DestReg, unsigned SubReg,
|
||||
const MachineInstr *Orig) const;
|
||||
virtual bool isDeadInstruction(const MachineInstr *MI) const;
|
||||
|
||||
virtual unsigned GetFunctionSizeInBytes(const MachineFunction &MF) const;
|
||||
};
|
||||
|
||||
|
@ -143,27 +143,6 @@ void TargetInstrInfoImpl::reMaterialize(MachineBasicBlock &MBB,
|
||||
MBB.insert(I, MI);
|
||||
}
|
||||
|
||||
bool TargetInstrInfoImpl::isDeadInstruction(const MachineInstr *MI) const {
|
||||
const TargetInstrDesc &TID = MI->getDesc();
|
||||
if (TID.mayLoad() || TID.mayStore() || TID.isCall() || TID.isTerminator() ||
|
||||
TID.isCall() || TID.isBarrier() || TID.isReturn() ||
|
||||
TID.hasUnmodeledSideEffects())
|
||||
return false;
|
||||
for (unsigned i = 0, e = MI->getNumOperands(); i != e; ++i) {
|
||||
const MachineOperand &MO = MI->getOperand(i);
|
||||
if (!MO.isReg() || !MO.getReg())
|
||||
continue;
|
||||
if (MO.isDef() && !MO.isDead())
|
||||
return false;
|
||||
if (MO.isUse() && MO.isKill())
|
||||
// FIXME: We can't remove kill markers or else the scavenger will assert.
|
||||
// An alternative is to add a ADD pseudo instruction to replace kill
|
||||
// markers.
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned
|
||||
TargetInstrInfoImpl::GetFunctionSizeInBytes(const MachineFunction &MF) const {
|
||||
unsigned FnSize = 0;
|
||||
|
@ -1478,6 +1478,29 @@ private:
|
||||
++NumStores;
|
||||
}
|
||||
|
||||
/// isSafeToDelete - Return true if this instruction doesn't produce any side
|
||||
/// effect and all of its defs are dead.
|
||||
static bool isSafeToDelete(MachineInstr &MI) {
|
||||
const TargetInstrDesc &TID = MI.getDesc();
|
||||
if (TID.mayLoad() || TID.mayStore() || TID.isCall() || TID.isTerminator() ||
|
||||
TID.isCall() || TID.isBarrier() || TID.isReturn() ||
|
||||
TID.hasUnmodeledSideEffects())
|
||||
return false;
|
||||
for (unsigned i = 0, e = MI.getNumOperands(); i != e; ++i) {
|
||||
MachineOperand &MO = MI.getOperand(i);
|
||||
if (!MO.isReg() || !MO.getReg())
|
||||
continue;
|
||||
if (MO.isDef() && !MO.isDead())
|
||||
return false;
|
||||
if (MO.isUse() && MO.isKill())
|
||||
// FIXME: We can't remove kill markers or else the scavenger will assert.
|
||||
// An alternative is to add a ADD pseudo instruction to replace kill
|
||||
// markers.
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// TransferDeadness - A identity copy definition is dead and it's being
|
||||
/// removed. Find the last def or use and mark it as dead / kill.
|
||||
void TransferDeadness(MachineBasicBlock *MBB, unsigned CurDist,
|
||||
@ -1519,7 +1542,7 @@ private:
|
||||
if (LastUD->isDef()) {
|
||||
// If the instruction has no side effect, delete it and propagate
|
||||
// backward further. Otherwise, mark is dead and we are done.
|
||||
if (!TII->isDeadInstruction(LastUDMI)) {
|
||||
if (!isSafeToDelete(*LastUDMI)) {
|
||||
LastUD->setIsDead();
|
||||
break;
|
||||
}
|
||||
@ -2340,7 +2363,7 @@ private:
|
||||
}
|
||||
ProcessNextInst:
|
||||
// Delete dead instructions without side effects.
|
||||
if (!Erased && !BackTracked && TII->isDeadInstruction(&MI)) {
|
||||
if (!Erased && !BackTracked && isSafeToDelete(MI)) {
|
||||
InvalidateKills(MI, TRI, RegKills, KillOps);
|
||||
VRM.RemoveMachineInstrFromMaps(&MI);
|
||||
MBB.erase(&MI);
|
||||
|
@ -146,13 +146,6 @@ public:
|
||||
virtual bool BlockHasNoFallThrough(const MachineBasicBlock &MBB) const;
|
||||
virtual
|
||||
bool ReverseBranchCondition(SmallVectorImpl<MachineOperand> &Cond) const;
|
||||
|
||||
virtual bool isDeadInstruction(const MachineInstr *MI) const {
|
||||
// FIXME: Without this, ppc llvm-gcc doesn't bootstrap. That means some
|
||||
// instruction definitions are not modeling side effects correctly.
|
||||
// This is a workaround until we know the exact cause.
|
||||
return false;
|
||||
}
|
||||
|
||||
/// GetInstSize - Return the number of bytes of code the specified
|
||||
/// instruction may be. This returns the maximum number of bytes.
|
||||
|
Loading…
x
Reference in New Issue
Block a user