IT instructions are considered to be scheduling hazards, but are scheduled
authorJim Grosbach <grosbach@apple.com>
Fri, 25 Jun 2010 18:43:14 +0000 (18:43 +0000)
committerJim Grosbach <grosbach@apple.com>
Fri, 25 Jun 2010 18:43:14 +0000 (18:43 +0000)
with the following instructions. This is done via trickery by considering the
instruction preceding the IT to be the hazard. Care must be taken to ensure
it's the first non-debug instruction, or the presence of debug info will
affect codegen.

Part of the continuing work for rdar://7797940, making ARM code-gen unaffected
by the presence of debug information.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@106871 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/ARM/ARMBaseInstrInfo.cpp

index b9bc0b8f220cf99b367a4dab5111ae3c8c5c07e8..7ef7fd689a87504d35a3c7dce914487c8de5e90c 100644 (file)
@@ -1410,6 +1410,15 @@ bool ARMBaseInstrInfo::shouldScheduleLoadsNear(SDNode *Load1, SDNode *Load2,
 bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
                                             const MachineBasicBlock *MBB,
                                             const MachineFunction &MF) const {
+  // Debug info is never a scheduling boundary. It's necessary to be explicit
+  // due to the special treatment of IT instructions below, otherwise a
+  // dbg_value followed by an IT will result in the IT instruction being
+  // considered a scheduling hazard, which is wrong. It should be the actual
+  // instruction preceding the dbg_value instruction(s), just like it is
+  // when debug info is not present.
+  if (MI->isDebugValue())
+    return false;
+
   // Terminators and labels can't be scheduled around.
   if (MI->getDesc().isTerminator() || MI->isLabel())
     return true;
@@ -1421,7 +1430,10 @@ bool ARMBaseInstrInfo::isSchedulingBoundary(const MachineInstr *MI,
   // to the t2IT instruction. The added compile time and complexity does not
   // seem worth it.
   MachineBasicBlock::const_iterator I = MI;
-  if (++I != MBB->end() && I->getOpcode() == ARM::t2IT)
+  // Make sure to skip any dbg_value instructions
+  while (++I != MBB->end() && I->isDebugValue())
+    ;
+  if (I != MBB->end() && I->getOpcode() == ARM::t2IT)
     return true;
 
   // Don't attempt to schedule around any instruction that defines