diff options
author | Sam Parker <sam.parker@arm.com> | 2019-11-26 10:25:04 +0000 |
---|---|---|
committer | Sam Parker <sam.parker@arm.com> | 2019-11-26 10:27:46 +0000 |
commit | 28166816b05aebb3154e5f8a28b3ef447cce8471 (patch) | |
tree | 687b1f187926d122f6aa34f43172e12ed6f55b7c /llvm/lib/CodeGen/ReachingDefAnalysis.cpp | |
parent | 3ec193fb527e697faac4ef8f30934dd7bce849a7 (diff) | |
download | bcm5719-llvm-28166816b05aebb3154e5f8a28b3ef447cce8471.tar.gz bcm5719-llvm-28166816b05aebb3154e5f8a28b3ef447cce8471.zip |
[ARM][ReachingDefs] Remove dead code in loloops.
Add some more helper functions to ReachingDefs to query the uses of
a given MachineInstr and also to query whether two MachineInstrs use
the same def of a register.
For Arm, while tail-predicating, these helpers are used in the
low-overhead loops to remove the dead code that calculates the number
of loop iterations.
Differential Revision: https://reviews.llvm.org/D70240
Diffstat (limited to 'llvm/lib/CodeGen/ReachingDefAnalysis.cpp')
-rw-r--r-- | llvm/lib/CodeGen/ReachingDefAnalysis.cpp | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp index 55d9cb65999..ad7f910be4c 100644 --- a/llvm/lib/CodeGen/ReachingDefAnalysis.cpp +++ b/llvm/lib/CodeGen/ReachingDefAnalysis.cpp @@ -194,9 +194,19 @@ MachineInstr* ReachingDefAnalysis::getReachingMIDef(MachineInstr *MI, int PhysRe return getInstFromId(MI->getParent(), getReachingDef(MI, PhysReg)); } +bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B, + int PhysReg) { + MachineBasicBlock *ParentA = A->getParent(); + MachineBasicBlock *ParentB = B->getParent(); + if (ParentA != ParentB) + return false; + + return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg); +} + MachineInstr *ReachingDefAnalysis::getInstFromId(MachineBasicBlock *MBB, int InstId) { - assert(MBB->getNumber() < MBBReachingDefs.size() && + assert(static_cast<size_t>(MBB->getNumber()) < MBBReachingDefs.size() && "Unexpected basic block number."); assert(InstId < static_cast<int>(MBB->size()) && "Unexpected instruction id."); @@ -216,14 +226,31 @@ int ReachingDefAnalysis::getClearance(MachineInstr *MI, MCPhysReg PhysReg) { return InstIds[MI] - getReachingDef(MI, PhysReg); } -bool ReachingDefAnalysis::hasSameReachingDef(MachineInstr *A, MachineInstr *B, - int PhysReg) { - MachineBasicBlock *ParentA = A->getParent(); - MachineBasicBlock *ParentB = B->getParent(); - if (ParentA != ParentB) - return false; +void ReachingDefAnalysis::getReachingLocalUses(MachineInstr *Def, int PhysReg, + SmallVectorImpl<MachineInstr*> &Uses) { + MachineBasicBlock *MBB = Def->getParent(); + MachineBasicBlock::iterator MI = MachineBasicBlock::iterator(Def); + while (++MI != MBB->end()) { + for (auto &MO : MI->operands()) { + if (!MO.isReg() || !MO.isUse() || MO.getReg() != PhysReg) + continue; + + // If/when we find a new reaching def, we know that there's no more uses + // of 'Def'. + if (getReachingMIDef(&*MI, PhysReg) != Def) + return; + + Uses.push_back(&*MI); + if (MO.isKill()) + return; + } + } +} - return getReachingDef(A, PhysReg) == getReachingDef(B, PhysReg); +unsigned ReachingDefAnalysis::getNumUses(MachineInstr *Def, int PhysReg) { + SmallVector<MachineInstr*, 4> Uses; + getReachingLocalUses(Def, PhysReg, Uses); + return Uses.size(); } bool ReachingDefAnalysis::isRegUsedAfter(MachineInstr *MI, int PhysReg) { |