diff options
| author | Petar Avramovic <Petar.Avramovic@rt-rk.com> | 2019-07-11 09:28:34 +0000 |
|---|---|---|
| committer | Petar Avramovic <Petar.Avramovic@rt-rk.com> | 2019-07-11 09:28:34 +0000 |
| commit | 962524070a0dc6b87bc179de43a671a169355e7a (patch) | |
| tree | 430f8d7c182a1dcdbc523e95845a67e39a9bcd33 /llvm/lib/Target | |
| parent | e3bb0a72b6ad2264f552d6e2769a4ce63bb46ed9 (diff) | |
| download | bcm5719-llvm-962524070a0dc6b87bc179de43a671a169355e7a.tar.gz bcm5719-llvm-962524070a0dc6b87bc179de43a671a169355e7a.zip | |
[MIPS GlobalISel] Skip copies in addUseDef and addDefUses
Skip copies between virtual registers during search for UseDefs
and DefUses.
Since each operand has one def search for UseDefs is straightforward.
But since operand can have many uses, we have to check all uses of
each copy we traverse during search for DefUses.
Differential Revision: https://reviews.llvm.org/D64486
llvm-svn: 365744
Diffstat (limited to 'llvm/lib/Target')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp | 45 | ||||
| -rw-r--r-- | llvm/lib/Target/Mips/MipsRegisterBankInfo.h | 14 |
2 files changed, 48 insertions, 11 deletions
diff --git a/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp b/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp index 63cb66416f3..d8bcf16afd5 100644 --- a/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp +++ b/llvm/lib/Target/Mips/MipsRegisterBankInfo.cpp @@ -160,12 +160,14 @@ void MipsRegisterBankInfo::AmbiguousRegDefUseContainer::addDefUses( assert(!MRI.getType(Reg).isPointer() && "Pointers are gprb, they should not be considered as ambiguous.\n"); for (MachineInstr &UseMI : MRI.use_instructions(Reg)) { - if (UseMI.getOpcode() == TargetOpcode::COPY && - !TargetRegisterInfo::isPhysicalRegister(UseMI.getOperand(0).getReg())) - // Copies of non-physical registers are not supported - return; - - DefUses.push_back(&UseMI); + MachineInstr *NonCopyInstr = skipCopiesOutgoing(&UseMI); + // Copy with many uses. + if (NonCopyInstr->getOpcode() == TargetOpcode::COPY && + !TargetRegisterInfo::isPhysicalRegister( + NonCopyInstr->getOperand(0).getReg())) + addDefUses(NonCopyInstr->getOperand(0).getReg(), MRI); + else + DefUses.push_back(skipCopiesOutgoing(&UseMI)); } } @@ -174,12 +176,33 @@ void MipsRegisterBankInfo::AmbiguousRegDefUseContainer::addUseDef( assert(!MRI.getType(Reg).isPointer() && "Pointers are gprb, they should not be considered as ambiguous.\n"); MachineInstr *DefMI = MRI.getVRegDef(Reg); - if (DefMI->getOpcode() == TargetOpcode::COPY && - !TargetRegisterInfo::isPhysicalRegister(DefMI->getOperand(1).getReg())) - // Copies from non-physical registers are not supported. - return; + UseDefs.push_back(skipCopiesIncoming(DefMI)); +} + +MachineInstr * +MipsRegisterBankInfo::AmbiguousRegDefUseContainer::skipCopiesOutgoing( + MachineInstr *MI) const { + const MachineFunction &MF = *MI->getParent()->getParent(); + const MachineRegisterInfo &MRI = MF.getRegInfo(); + MachineInstr *Ret = MI; + while (Ret->getOpcode() == TargetOpcode::COPY && + !TargetRegisterInfo::isPhysicalRegister(Ret->getOperand(0).getReg()) && + MRI.hasOneUse(Ret->getOperand(0).getReg())) { + Ret = &(*MRI.use_instr_begin(Ret->getOperand(0).getReg())); + } + return Ret; +} - UseDefs.push_back(DefMI); +MachineInstr * +MipsRegisterBankInfo::AmbiguousRegDefUseContainer::skipCopiesIncoming( + MachineInstr *MI) const { + const MachineFunction &MF = *MI->getParent()->getParent(); + const MachineRegisterInfo &MRI = MF.getRegInfo(); + MachineInstr *Ret = MI; + while (Ret->getOpcode() == TargetOpcode::COPY && + !TargetRegisterInfo::isPhysicalRegister(Ret->getOperand(1).getReg())) + Ret = MRI.getVRegDef(Ret->getOperand(1).getReg()); + return Ret; } MipsRegisterBankInfo::AmbiguousRegDefUseContainer::AmbiguousRegDefUseContainer( diff --git a/llvm/lib/Target/Mips/MipsRegisterBankInfo.h b/llvm/lib/Target/Mips/MipsRegisterBankInfo.h index 704d40a6b10..176813c031e 100644 --- a/llvm/lib/Target/Mips/MipsRegisterBankInfo.h +++ b/llvm/lib/Target/Mips/MipsRegisterBankInfo.h @@ -73,6 +73,20 @@ private: void addDefUses(Register Reg, const MachineRegisterInfo &MRI); void addUseDef(Register Reg, const MachineRegisterInfo &MRI); + /// Skip copy instructions until we get to a non-copy instruction or to a + /// copy with phys register as def. Used during search for DefUses. + /// MI : %5 = COPY %4 + /// %6 = COPY %5 + /// $v0 = COPY %6 <- we want this one. + MachineInstr *skipCopiesOutgoing(MachineInstr *MI) const; + + /// Skip copy instructions until we get to a non-copy instruction or to a + /// copy with phys register as use. Used during search for UseDefs. + /// %1 = COPY $a1 <- we want this one. + /// %2 = COPY %1 + /// MI = %3 = COPY %2 + MachineInstr *skipCopiesIncoming(MachineInstr *MI) const; + public: AmbiguousRegDefUseContainer(const MachineInstr *MI); SmallVectorImpl<MachineInstr *> &getDefUses() { return DefUses; } |

