mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-19 19:12:56 +02:00
[ARM] Tidy-up Cortex-A15 DPR-SPR optimizer implementation
Modernise the code with range-loops etc Reviewed by: @fhahn, @rovka Differential Revision: https://reviews.llvm.org/D36502 llvm-svn: 310807
This commit is contained in:
parent
ae34cf0b5a
commit
e0e3cf49f9
@ -189,8 +189,7 @@ void A15SDOptimizer::eraseInstrWithNoUses(MachineInstr *MI) {
|
|||||||
|
|
||||||
// MI is already known to be dead. We need to see
|
// MI is already known to be dead. We need to see
|
||||||
// if other instructions can also be removed.
|
// if other instructions can also be removed.
|
||||||
for (unsigned int i = 0; i < MI->getNumOperands(); ++i) {
|
for (MachineOperand &MO : MI->operands()) {
|
||||||
MachineOperand &MO = MI->getOperand(i);
|
|
||||||
if ((!MO.isReg()) || (!MO.isUse()))
|
if ((!MO.isReg()) || (!MO.isUse()))
|
||||||
continue;
|
continue;
|
||||||
unsigned Reg = MO.getReg();
|
unsigned Reg = MO.getReg();
|
||||||
@ -212,8 +211,7 @@ void A15SDOptimizer::eraseInstrWithNoUses(MachineInstr *MI) {
|
|||||||
// dead. If so, we can also mark this instruction as being
|
// dead. If so, we can also mark this instruction as being
|
||||||
// dead.
|
// dead.
|
||||||
bool IsDead = true;
|
bool IsDead = true;
|
||||||
for (unsigned int j = 0; j < Def->getNumOperands(); ++j) {
|
for (MachineOperand &MODef : Def->operands()) {
|
||||||
MachineOperand &MODef = Def->getOperand(j);
|
|
||||||
if ((!MODef.isReg()) || (!MODef.isDef()))
|
if ((!MODef.isReg()) || (!MODef.isDef()))
|
||||||
continue;
|
continue;
|
||||||
unsigned DefReg = MODef.getReg();
|
unsigned DefReg = MODef.getReg();
|
||||||
@ -221,13 +219,11 @@ void A15SDOptimizer::eraseInstrWithNoUses(MachineInstr *MI) {
|
|||||||
IsDead = false;
|
IsDead = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
for (MachineRegisterInfo::use_instr_iterator
|
for (MachineInstr &Use : MRI->use_instructions(Reg)) {
|
||||||
II = MRI->use_instr_begin(Reg), EE = MRI->use_instr_end();
|
|
||||||
II != EE; ++II) {
|
|
||||||
// We don't care about self references.
|
// We don't care about self references.
|
||||||
if (&*II == Def)
|
if (&Use == Def)
|
||||||
continue;
|
continue;
|
||||||
if (DeadInstr.find(&*II) == DeadInstr.end()) {
|
if (DeadInstr.find(&Use) == DeadInstr.end()) {
|
||||||
IsDead = false;
|
IsDead = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -405,9 +401,7 @@ SmallVector<unsigned, 8> A15SDOptimizer::getReadDPRs(MachineInstr *MI) {
|
|||||||
return SmallVector<unsigned, 8>();
|
return SmallVector<unsigned, 8>();
|
||||||
|
|
||||||
SmallVector<unsigned, 8> Defs;
|
SmallVector<unsigned, 8> Defs;
|
||||||
for (unsigned i = 0; i < MI->getNumOperands(); ++i) {
|
for (MachineOperand &MO : MI->operands()) {
|
||||||
MachineOperand &MO = MI->getOperand(i);
|
|
||||||
|
|
||||||
if (!MO.isReg() || !MO.isUse())
|
if (!MO.isReg() || !MO.isUse())
|
||||||
continue;
|
continue;
|
||||||
if (!usesRegClass(MO, &ARM::DPRRegClass) &&
|
if (!usesRegClass(MO, &ARM::DPRRegClass) &&
|
||||||
@ -617,10 +611,7 @@ bool A15SDOptimizer::runOnInstruction(MachineInstr *MI) {
|
|||||||
|
|
||||||
elideCopiesAndPHIs(Def, DefSrcs);
|
elideCopiesAndPHIs(Def, DefSrcs);
|
||||||
|
|
||||||
for (SmallVectorImpl<MachineInstr *>::iterator II = DefSrcs.begin(),
|
for (MachineInstr *MI : DefSrcs) {
|
||||||
EE = DefSrcs.end(); II != EE; ++II) {
|
|
||||||
MachineInstr *MI = *II;
|
|
||||||
|
|
||||||
// If we've already analyzed and replaced this operand, don't do
|
// If we've already analyzed and replaced this operand, don't do
|
||||||
// anything.
|
// anything.
|
||||||
if (Replacements.find(MI) != Replacements.end())
|
if (Replacements.find(MI) != Replacements.end())
|
||||||
@ -682,20 +673,14 @@ bool A15SDOptimizer::runOnMachineFunction(MachineFunction &Fn) {
|
|||||||
DeadInstr.clear();
|
DeadInstr.clear();
|
||||||
Replacements.clear();
|
Replacements.clear();
|
||||||
|
|
||||||
for (MachineFunction::iterator MFI = Fn.begin(), E = Fn.end(); MFI != E;
|
for (MachineBasicBlock &MBB : Fn) {
|
||||||
++MFI) {
|
for (MachineInstr &MI : MBB) {
|
||||||
|
Modified |= runOnInstruction(&MI);
|
||||||
for (MachineBasicBlock::iterator MI = MFI->begin(), ME = MFI->end();
|
|
||||||
MI != ME;) {
|
|
||||||
Modified |= runOnInstruction(&*MI++);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (std::set<MachineInstr *>::iterator I = DeadInstr.begin(),
|
for (MachineInstr *MI : DeadInstr) {
|
||||||
E = DeadInstr.end();
|
MI->eraseFromParent();
|
||||||
I != E; ++I) {
|
|
||||||
(*I)->eraseFromParent();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return Modified;
|
return Modified;
|
||||||
|
Loading…
Reference in New Issue
Block a user