summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-06-02 14:33:08 +0000
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>2016-06-02 14:33:08 +0000
commit3d6fc83a5841785a20aace016cd5d2e130ac74e4 (patch)
tree5daed83897085b1b48ed41b8da1254975df7ce4e /llvm/lib
parentf69ff7120bc6a77a79dba6df20eac727e8f158bb (diff)
downloadbcm5719-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.cpp17
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())
OpenPOWER on IntegriCloud