[Hexagon] Skip reserved physical registers when updating liveness

llvm-svn: 331518
This commit is contained in:
Krzysztof Parzyszek 2018-05-04 13:59:05 +00:00
parent 24fb4fcb93
commit af73d2bdd9
2 changed files with 38 additions and 1 deletions

View File

@ -547,7 +547,14 @@ void HexagonExpandCondsets::removeInstr(MachineInstr &MI) {
void HexagonExpandCondsets::updateLiveness(std::set<unsigned> &RegSet,
bool Recalc, bool UpdateKills, bool UpdateDeads) {
UpdateKills |= UpdateDeads;
for (auto R : RegSet) {
for (unsigned R : RegSet) {
if (!TargetRegisterInfo::isVirtualRegister(R)) {
assert(TargetRegisterInfo::isPhysicalRegister(R));
// There shouldn't be any physical registers as operands, except
// possibly reserved registers.
assert(MRI->isReserved(R));
continue;
}
if (Recalc)
recalculateLiveInterval(R);
if (UpdateKills)

View File

@ -0,0 +1,30 @@
# RUN: llc -march=hexagon -run-pass expand-condsets %s -o - | FileCheck %s
# REQUIRES: asserts
# The physical register as an operand to C2_mux caused a crash.
# Check that this compiles successfully and that the mux is expanded.
# CHECK: %2:intregs = A2_tfrt %1, $r31
# CHECK: %2:intregs = A2_tfrf killed %1, killed %0, implicit %2(tied-def 0)
name: fred
tracksRegLiveness: true
body: |
bb.0:
successors: %bb.1, %bb.2
liveins: $r0
%0:intregs = A2_tfrsi 0 ;; Multiple defs to ensure IsSSA = false
%0:intregs = L2_loadri_io $r0, 0
%1:predregs = C2_cmplt %0, 10
%2:intregs = C2_mux %1, $r31, %0
%3:predregs = C2_cmpeqi %2, 0
J2_jumpt %3, %bb.1, implicit-def $pc
J2_jump %bb.2, implicit-def $pc
bb.1:
PS_jmpret $r31, implicit-def $pc
bb.2:
PS_jmpret $r31, implicit-def $pc
...