MachineCSE: Respect interblock physreg liveness

Summary:
This is a fix for PR32538. MachineCSE first looks at MO.isDead(), but
if it is not marked dead, MachineCSE still wants to do its own check
to see if it is trivially dead. This check for the trivial case
assumed that physical registers cannot be live out of a block.

Patch by Mattias Eriksson.

Reviewers: qcolombet, jbhateja

Reviewed By: qcolombet, jbhateja

Subscribers: jbhateja, llvm-commits

Differential Revision: https://reviews.llvm.org/D33408

llvm-svn: 303731
This commit is contained in:
Mikael Holmen 2017-05-24 09:35:23 +00:00
parent 13e016bf48
commit 2676f8269a
2 changed files with 37 additions and 2 deletions

View File

@ -180,8 +180,8 @@ MachineCSE::isPhysDefTriviallyDead(unsigned Reg,
I = skipDebugInstructionsForward(I, E);
if (I == E)
// Reached end of block, register is obviously dead.
return true;
// Reached end of block, we don't know if register is dead or not.
return false;
bool SeenDef = false;
for (const MachineOperand &MO : I->operands()) {

View File

@ -0,0 +1,35 @@
# RUN: llc -mtriple thumbv5e -run-pass=machine-cse -o - %s | FileCheck %s
# This is a contrived example made to expose a bug in
# MachineCSE, see PR32538.
# MachineCSE must not remove this def of %cpsr:
# CHECK-LABEL: bb.1:
# CHECK: , %cpsr = tLSLri
...
---
name: spam
registers:
- { id: 0, class: tgpr }
- { id: 1, class: tgpr }
- { id: 2, class: tgpr }
- { id: 3, class: tgpr }
liveins:
- { reg: '%r0', virtual-reg: '%0' }
body: |
bb.0:
liveins: %r0
%0 = COPY %r0
%1, %cpsr = tLSLri %0, 2, 14, _
tCMPi8 %0, 5, 14, _, implicit-def %cpsr
tBcc %bb.8, 8, %cpsr
bb.1:
%2, %cpsr = tLSLri %0, 2, 14, _
bb.8:
liveins: %cpsr
%3 = COPY %cpsr
tSTRi killed %3, %0, 0, 14, _
...