[Hexagon] Skip reserved physical registers when updating liveness
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Fri, 4 May 2018 13:59:05 +0000 (13:59 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Fri, 4 May 2018 13:59:05 +0000 (13:59 +0000)
llvm-svn: 331518

llvm/lib/Target/Hexagon/HexagonExpandCondsets.cpp
llvm/test/CodeGen/Hexagon/expand-condsets-phys-reg.mir [new file with mode: 0644]

index f46f610..06caa2f 100644 (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)
diff --git a/llvm/test/CodeGen/Hexagon/expand-condsets-phys-reg.mir b/llvm/test/CodeGen/Hexagon/expand-condsets-phys-reg.mir
new file mode 100644 (file)
index 0000000..2484f6b
--- /dev/null
@@ -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
+...