diff options
-rw-r--r-- | llvm/lib/Target/Hexagon/RDFCopy.cpp | 8 | ||||
-rw-r--r-- | llvm/test/CodeGen/Hexagon/rdf-copy-renamable-reserved.mir | 19 |
2 files changed, 25 insertions, 2 deletions
diff --git a/llvm/lib/Target/Hexagon/RDFCopy.cpp b/llvm/lib/Target/Hexagon/RDFCopy.cpp index f8c766ac972..212f75c746c 100644 --- a/llvm/lib/Target/Hexagon/RDFCopy.cpp +++ b/llvm/lib/Target/Hexagon/RDFCopy.cpp @@ -18,6 +18,7 @@ #include "llvm/CodeGen/MachineDominators.h" #include "llvm/CodeGen/MachineInstr.h" #include "llvm/CodeGen/MachineOperand.h" +#include "llvm/CodeGen/MachineRegisterInfo.h" #include "llvm/CodeGen/TargetOpcodes.h" #include "llvm/CodeGen/TargetRegisterInfo.h" #include "llvm/MC/MCRegisterInfo.h" @@ -100,10 +101,11 @@ NodeId CopyPropagation::getLocalReachingDef(RegisterRef RefRR, bool CopyPropagation::run() { scanBlock(&DFG.getMF().front()); + MachineRegisterInfo &MRI = DFG.getMF().getRegInfo(); if (trace()) { dbgs() << "Copies:\n"; - for (auto I : Copies) { + for (NodeId I : Copies) { dbgs() << "Instr: " << *DFG.addr<StmtNode*>(I).Addr->getCode(); dbgs() << " eq: {"; for (auto J : CopyMap[I]) @@ -130,7 +132,7 @@ bool CopyPropagation::run() { return 0; }; - for (auto C : Copies) { + for (NodeId C : Copies) { #ifndef NDEBUG if (HasLimit && CpCount >= CpLimit) break; @@ -179,6 +181,8 @@ bool CopyPropagation::run() { unsigned NewReg = MinPhysReg(SR); Op.setReg(NewReg); Op.setSubReg(0); + if (MRI.isReserved(NewReg)) + Op.setIsRenamable(false); DFG.unlinkUse(UA, false); if (AtCopy != 0) { UA.Addr->linkToDef(UA.Id, DFG.addr<DefNode*>(AtCopy)); diff --git a/llvm/test/CodeGen/Hexagon/rdf-copy-renamable-reserved.mir b/llvm/test/CodeGen/Hexagon/rdf-copy-renamable-reserved.mir new file mode 100644 index 00000000000..c468aa7d4ce --- /dev/null +++ b/llvm/test/CodeGen/Hexagon/rdf-copy-renamable-reserved.mir @@ -0,0 +1,19 @@ +# RUN: llc -march=hexagon -run-pass hexagon-rdf-opt %s -o - | FileCheck %s + +# Check that r29 gets propagated into the A2_addi, and that the renamable +# flag is cleared. + +# CHECK: renamable %r28 = COPY %r29 +# CHECK-NOT: renamable + +--- +name: fred +tracksRegLiveness: true + +body: | + bb.0: + renamable %r28 = COPY %r29 + %r0 = A2_addi renamable %r28, 1 + J2_jumpr %r31, implicit-def %pc, implicit %r0 +... + |