[Hexagon] Add implicit uses even when untied explicit uses are present

An explicit untied use is not sufficient to maintain liveness of a
register redefined in a predicated instruction. For example
  %1 = COPY %0
  ...
  %1 = A2_paddif %2, %1, 1
could become
  $r1 = COPY $r0
  ...
  $r1 = A2_paddif $p0, $r1, 1
and later
  $r1 = COPY $r0                ;; this is not really dead!
  ...
  $r1 = A2_paddif $p0, $r0, 1

llvm-svn: 336662
This commit is contained in:
Krzysztof Parzyszek 2018-07-10 12:57:49 +00:00
parent 6a9c719ee1
commit c052451a02
2 changed files with 30 additions and 2 deletions

View File

@ -499,6 +499,9 @@ void HexagonExpandCondsets::updateDeadsInRange(unsigned Reg, LaneBitmask LM,
if (!Op.isReg() || !DefRegs.count(Op))
continue;
if (Op.isDef()) {
// Tied defs will always have corresponding uses, so no extra
// implicit uses are needed.
if (!Op.isTied())
ImpUses.insert({Op, i});
} else {
// This function can be called for the same register with different
@ -506,6 +509,7 @@ void HexagonExpandCondsets::updateDeadsInRange(unsigned Reg, LaneBitmask LM,
// register, we can get here more than once. Avoid adding multiple
// implicit uses (or adding an implicit use when an explicit one is
// present).
if (Op.isTied())
ImpUses.erase(Op);
}
}

View File

@ -0,0 +1,24 @@
# RUN: llc -march=hexagon -run-pass=expand-condsets %s -o - | FileCheck %s
# Check that there is a tied implicit use despite having an explicit (but
# untied) use:
# CHECK: %[[R:[0-9]+]]:intregs = A2_paddif killed %{{[0-9]+}}, %[[R]], 1, implicit %[[R]](tied-def 0)
name: f0
tracksRegLiveness: true
body: |
bb.0:
successors: %bb.1
liveins: $r0, $r1
%0:intregs = COPY $r0
%1:intregs = COPY $r1
%2:intregs = COPY $r0
%3:intregs = M2_mpyi %2, %1
%4:intregs = A2_sub %0, %3
%5:predregs = C2_cmpeqi %4, 0
%6:intregs = A2_addi %2, 1
%7:intregs = C2_mux %5, %2, %6
bb.1:
...