[Hexagon] Don't form new-value jumps from floating-point instructions
authorKrzysztof Parzyszek <kparzysz@codeaurora.org>
Tue, 6 Feb 2018 19:08:41 +0000 (19:08 +0000)
committerKrzysztof Parzyszek <kparzysz@codeaurora.org>
Tue, 6 Feb 2018 19:08:41 +0000 (19:08 +0000)
Additionally, verify that the register defined by the producer is a
32-bit register.

llvm-svn: 324381

llvm/lib/Target/Hexagon/HexagonNewValueJump.cpp
llvm/test/CodeGen/Hexagon/newvaluejump-float.mir [new file with mode: 0644]

index ffa447cc1311e7a82ffeddbd8ef8317e4aa85c7d..bb733fed044537976b872f0b61518ecfc9e468ef 100644 (file)
@@ -142,6 +142,22 @@ static bool canBeFeederToNewValueJump(const HexagonInstrInfo *QII,
   if (QII->isSolo(*II))
     return false;
 
+  if (QII->isFloat(*II))
+    return false;
+
+  // Make sure that the (unique) def operand is a register from IntRegs.
+  bool HadDef = false;
+  for (const MachineOperand &Op : II->operands()) {
+    if (!Op.isReg() || !Op.isDef())
+      continue;
+    if (HadDef)
+      return false;
+    HadDef = true;
+    if (!Hexagon::IntRegsRegClass.contains(Op.getReg()))
+      return false;
+  }
+  assert(HadDef);
+
   // Make sure there there is no 'def' or 'use' of any of the uses of
   // feeder insn between it's definition, this MI and jump, jmpInst
   // skipping compare, cmpInst.
diff --git a/llvm/test/CodeGen/Hexagon/newvaluejump-float.mir b/llvm/test/CodeGen/Hexagon/newvaluejump-float.mir
new file mode 100644 (file)
index 0000000..9cef4cd
--- /dev/null
@@ -0,0 +1,19 @@
+# RUN: llc -march=hexagon -run-pass=hexagon-nvj %s -o - | FileCheck %s
+
+# Check that we don't generate a new-value jump for a floating-point
+# instruction.
+# CHECK-NOT: J4_cmpgti_t_jumpnv_t
+
+---
+name: fred
+tracksRegLiveness: true
+body: |
+  bb.0:
+    liveins: $d0
+      $r0 = F2_conv_df2w_chop $d0, implicit $usr
+      $p0 = C2_cmpgti $r0, 30
+      J2_jumpt $p0, %bb.1, implicit-def $pc
+  bb.1:
+      J2_jumpr $r31, implicit-def $pc
+...
+