mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-09 13:21:30 +00:00
IfConversion: Add implicit uses for redefined regs with live subregisters
Normally, if conversion would add implicit uses for redefined registers, e.g. R0<def> = add_if ..., R0<imp-use>. However, if only subregisters of R0 are known to be live but not R0 itself, such implicit uses will not be added, causing prior definitions of such subregisters and R0 itself to become dead. llvm-svn: 282626
This commit is contained in:
parent
ebf3beb03f
commit
738486a316
@ -1453,6 +1453,17 @@ static void UpdatePredRedefs(MachineInstr &MI, LivePhysRegs &Redefs) {
|
||||
}
|
||||
if (LiveBeforeMI.count(Reg))
|
||||
MIB.addReg(Reg, RegState::Implicit);
|
||||
else {
|
||||
bool HasLiveSubReg = false;
|
||||
for (MCSubRegIterator S(Reg, TRI); S.isValid(); ++S) {
|
||||
if (!LiveBeforeMI.count(*S))
|
||||
continue;
|
||||
HasLiveSubReg = true;
|
||||
break;
|
||||
}
|
||||
if (HasLiveSubReg)
|
||||
MIB.addReg(Reg, RegState::Implicit);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
50
test/CodeGen/Hexagon/ifcvt-live-subreg.mir
Normal file
50
test/CodeGen/Hexagon/ifcvt-live-subreg.mir
Normal file
@ -0,0 +1,50 @@
|
||||
# RUN: llc -march=hexagon -run-pass if-converter -o - %s | FileCheck %s
|
||||
# Check that an implicit use is generated for a predicated instruction
|
||||
# when a subregister of the redefined register is live.
|
||||
|
||||
# CHECK-LABEL: name: foo
|
||||
|
||||
# Verify the predicated block:
|
||||
# CHECK-LABEL: bb.0:
|
||||
# CHECK: liveins: %r0, %r1, %p0, %d8
|
||||
# CHECK: %d8 = A2_combinew killed %r0, killed %r1
|
||||
# CHECK: %d8 = L2_ploadrdf_io %p0, %r29, 0, implicit %d8
|
||||
# CHECK: J2_jumprf %p0, killed %r31, implicit-def %pc, implicit-def %pc, implicit killed %d8
|
||||
|
||||
--- |
|
||||
define void @foo() {
|
||||
ret void
|
||||
}
|
||||
...
|
||||
|
||||
|
||||
---
|
||||
name: foo
|
||||
alignment: 4
|
||||
tracksRegLiveness: true
|
||||
liveins:
|
||||
- { reg: '%r0' }
|
||||
- { reg: '%r1' }
|
||||
- { reg: '%p0' }
|
||||
- { reg: '%d8' }
|
||||
body: |
|
||||
bb.0:
|
||||
successors: %bb.1, %bb.2
|
||||
liveins: %r0, %r1, %p0, %d8
|
||||
%d8 = A2_combinew killed %r0, killed %r1
|
||||
J2_jumpf killed %p0, %bb.2, implicit-def %pc
|
||||
|
||||
bb.1:
|
||||
liveins: %d0, %r17
|
||||
%r0 = A2_tfrsi 0
|
||||
%r1 = A2_tfrsi 0
|
||||
A2_nop ; non-predicable
|
||||
J2_jumpr killed %r31, implicit-def dead %pc, implicit killed %d0
|
||||
|
||||
bb.2:
|
||||
; Predicate this block.
|
||||
%d8 = L2_loadrd_io %r29, 0
|
||||
J2_jumpr killed %r31, implicit-def dead %pc, implicit killed %d8
|
||||
|
||||
...
|
||||
|
Loading…
Reference in New Issue
Block a user