diff options
author | Matthias Braun <matze@braunis.de> | 2016-07-09 00:19:07 +0000 |
---|---|---|
committer | Matthias Braun <matze@braunis.de> | 2016-07-09 00:19:07 +0000 |
commit | 152e7c8b1222d2af61df72c08caaa740e553cb6c (patch) | |
tree | 7178c1d1db0b5bf2babca7793c71c079854e1156 /llvm/lib/CodeGen/VirtRegMap.cpp | |
parent | 07985809abeb97c131d37ee389ee0fea2a646516 (diff) | |
download | llvm-152e7c8b1222d2af61df72c08caaa740e553cb6c.zip llvm-152e7c8b1222d2af61df72c08caaa740e553cb6c.tar.gz llvm-152e7c8b1222d2af61df72c08caaa740e553cb6c.tar.bz2 |
VirtRegMap: Replace some identity copies with KILL instructions.
An identity COPY like this:
%AL = COPY %AL, %EAX<imp-def>
has no semantic effect, but encodes liveness information: Further users
of %EAX only depend on this instruction even though it does not define
the full register.
Replace the COPY with a KILL instruction in those cases to maintain this
liveness information. (This reverts a small part of r238588 but this
time adds a comment explaining why a KILL instruction is useful).
llvm-svn: 274952
Diffstat (limited to 'llvm/lib/CodeGen/VirtRegMap.cpp')
-rw-r--r-- | llvm/lib/CodeGen/VirtRegMap.cpp | 36 |
1 files changed, 27 insertions, 9 deletions
diff --git a/llvm/lib/CodeGen/VirtRegMap.cpp b/llvm/lib/CodeGen/VirtRegMap.cpp index 7713adb..8a3a032 100644 --- a/llvm/lib/CodeGen/VirtRegMap.cpp +++ b/llvm/lib/CodeGen/VirtRegMap.cpp @@ -166,6 +166,7 @@ class VirtRegRewriter : public MachineFunctionPass { void addMBBLiveIns(); bool readsUndefSubreg(const MachineOperand &MO) const; void addLiveInsForSubRanges(const LiveInterval &LI, unsigned PhysReg) const; + void handleIdentityCopy(MachineInstr &MI) const; public: static char ID; @@ -346,6 +347,30 @@ bool VirtRegRewriter::readsUndefSubreg(const MachineOperand &MO) const { return true; } +void VirtRegRewriter::handleIdentityCopy(MachineInstr &MI) const { + if (!MI.isIdentityCopy()) + return; + DEBUG(dbgs() << "Identity copy: " << MI); + ++NumIdCopies; + + // Copies like: + // %R0 = COPY %R0<undef> + // %AL = COPY %AL, %EAX<imp-def> + // give us additional liveness information: The target (super-)register + // must not be valid before this point. Replace the COPY with a KILL + // instruction to maintain this information. + if (MI.getOperand(0).isUndef() || MI.getNumOperands() > 2) { + MI.setDesc(TII->get(TargetOpcode::KILL)); + DEBUG(dbgs() << " replace by: " << MI); + return; + } + + if (Indexes) + Indexes->removeMachineInstrFromMaps(MI); + MI.eraseFromParent(); + DEBUG(dbgs() << " deleted.\n"); +} + void VirtRegRewriter::rewrite() { bool NoSubRegLiveness = !MRI->subRegLivenessEnabled(); SmallVector<unsigned, 8> SuperDeads; @@ -435,15 +460,8 @@ void VirtRegRewriter::rewrite() { DEBUG(dbgs() << "> " << *MI); - // Finally, remove any identity copies. - if (MI->isIdentityCopy()) { - ++NumIdCopies; - DEBUG(dbgs() << "Deleting identity copy.\n"); - if (Indexes) - Indexes->removeMachineInstrFromMaps(*MI); - // It's safe to erase MI because MII has already been incremented. - MI->eraseFromParent(); - } + // We can remove identity copies right now. + handleIdentityCopy(*MI); } } } |