diff options
| author | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-06-02 14:33:08 +0000 |
|---|---|---|
| committer | Krzysztof Parzyszek <kparzysz@codeaurora.org> | 2016-06-02 14:33:08 +0000 |
| commit | 3d6fc83a5841785a20aace016cd5d2e130ac74e4 (patch) | |
| tree | 5daed83897085b1b48ed41b8da1254975df7ce4e /llvm/lib | |
| parent | f69ff7120bc6a77a79dba6df20eac727e8f158bb (diff) | |
| download | bcm5719-llvm-3d6fc83a5841785a20aace016cd5d2e130ac74e4.tar.gz bcm5719-llvm-3d6fc83a5841785a20aace016cd5d2e130ac74e4.zip | |
[Hexagon] Expand COPY pseudo-instruction
Handle it locally instead of having the target-independent pass deal
with it. The generic pass does not preserve implicit uses, which may
be necessary.
llvm-svn: 271520
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp | 17 |
1 files changed, 11 insertions, 6 deletions
diff --git a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp index fddc8b4e9de..34aafc928e9 100644 --- a/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp +++ b/llvm/lib/Target/Hexagon/HexagonInstrInfo.cpp @@ -685,13 +685,8 @@ void HexagonInstrInfo::copyPhysReg(MachineBasicBlock &MBB, unsigned KillFlag = getKillRegState(KillSrc); if (Hexagon::IntRegsRegClass.contains(SrcReg, DestReg)) { - auto MIB = BuildMI(MBB, I, DL, get(Hexagon::A2_tfr), DestReg) + BuildMI(MBB, I, DL, get(Hexagon::A2_tfr), DestReg) .addReg(SrcReg, KillFlag); - // We could have a R12 = COPY R2, D1<imp-use, kill> instruction. - // Transfer the kill flags. - for (auto &Op : I->operands()) - if (Op.isReg() && Op.isKill() && Op.isImplicit() && Op.isUse()) - MIB.addReg(Op.getReg(), RegState::Kill | RegState::Implicit); return; } if (Hexagon::DoubleRegsRegClass.contains(SrcReg, DestReg)) { @@ -920,6 +915,16 @@ bool HexagonInstrInfo::expandPostRAPseudo(MachineBasicBlock::iterator MI) bool Is128B = false; switch (Opc) { + case TargetOpcode::COPY: { + MachineOperand &MD = MI->getOperand(0); + MachineOperand &MS = MI->getOperand(1); + if (MD.getReg() != MS.getReg() && !MS.isUndef()) { + copyPhysReg(MBB, MI, DL, MD.getReg(), MS.getReg(), MS.isKill()); + std::prev(MI)->copyImplicitOps(*MBB.getParent(), *MI); + } + MBB.erase(MI); + return true; + } case Hexagon::ALIGNA: BuildMI(MBB, MI, DL, get(Hexagon::A2_andir), MI->getOperand(0).getReg()) .addReg(HRI.getFrameRegister()) |

