A semi-gross fix for a debug info issue. When inserting the "function start" label...
authorEvan Cheng <evan.cheng@apple.com>
Wed, 30 Jan 2008 19:35:32 +0000 (19:35 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Wed, 30 Jan 2008 19:35:32 +0000 (19:35 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46568 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CodeGen/ScheduleDAG.h
lib/CodeGen/SelectionDAG/ScheduleDAG.cpp

index 37c0a9032a26393a007da3f1741afb0cc840da1e..77d1a1cce447f94a44572b5ea665ba5c7885fc4c 100644 (file)
@@ -24,6 +24,7 @@ namespace llvm {
   struct InstrStage;
   struct SUnit;
   class MachineConstantPool;
+  class MachineFunction;
   class MachineModuleInfo;
   class MachineRegisterInfo;
   class MachineInstr;
@@ -243,6 +244,7 @@ namespace llvm {
     const TargetMachine &TM;              // Target processor
     const TargetInstrInfo *TII;           // Target instruction information
     const MRegisterInfo *MRI;             // Target processor register info
+    MachineFunction *MF;                  // Machine function
     MachineRegisterInfo &RegInfo;         // Virtual/real register map
     MachineConstantPool *ConstPool;       // Target constant pool
     std::vector<SUnit*> Sequence;         // The schedule. Null SUnit*'s
index 543a9fb9dce34b1adc68143a85589d4429cbb606..1b53beddf7671a8e7c09e738c3cdbbb7584e8635 100644 (file)
@@ -31,6 +31,7 @@ ScheduleDAG::ScheduleDAG(SelectionDAG &dag, MachineBasicBlock *bb,
                          const TargetMachine &tm)
   : DAG(dag), BB(bb), TM(tm), RegInfo(BB->getParent()->getRegInfo()) {
     TII = TM.getInstrInfo();
+    MF  = &DAG.getMachineFunction();
     MRI = TM.getRegisterInfo();
     ConstPool = BB->getParent()->getConstantPool();
 }
@@ -710,13 +711,30 @@ void ScheduleDAG::EmitNode(SDNode *Node, unsigned InstanceNo,
     }
 
     // Now that we have emitted all operands, emit this instruction itself.
-    if (!II.usesCustomDAGSchedInsertionHook()) {
-      BB->insert(BB->end(), MI);
-    } else {
-      // Insert this instruction into the end of the basic block, potentially
-      // taking some custom action.
+    if (Opc == TargetInstrInfo::LABEL &&
+        !BB->empty() && &MF->front() == BB) {
+      // If we are inserting a LABEL and this happens to be the first label in
+      // the entry block, it is the "function start" label. Make sure there are
+      // no other instructions before it.
+      bool SeenLabel = false;
+      MachineBasicBlock::iterator MBBI = BB->begin();
+      while (MBBI != BB->end()) {
+        if (MBBI->getOpcode() == TargetInstrInfo::LABEL) {
+          SeenLabel = true;
+          break;
+        }
+        ++MBBI;
+      }
+      if (!SeenLabel)
+        BB->insert(BB->begin(), MI);
+      else
+        BB->push_back(MI);
+    } else if (II.usesCustomDAGSchedInsertionHook())
+      // Insert this instruction into the basic block using a target
+      // specific inserter which may returns a new basic block.
       BB = DAG.getTargetLoweringInfo().EmitInstrWithCustomInserter(MI, BB);
-    }
+    else
+      BB->push_back(MI);
 
     // Additional results must be an physical register def.
     if (HasPhysRegOuts) {
@@ -870,13 +888,12 @@ void ScheduleDAG::EmitSchedule() {
   // If this is the first basic block in the function, and if it has live ins
   // that need to be copied into vregs, emit the copies into the top of the
   // block before emitting the code for the block.
-  MachineFunction &MF = DAG.getMachineFunction();
-  if (&MF.front() == BB) {
+  if (&MF->front() == BB) {
     for (MachineRegisterInfo::livein_iterator LI = RegInfo.livein_begin(),
          E = RegInfo.livein_end(); LI != E; ++LI)
       if (LI->second) {
         const TargetRegisterClass *RC = RegInfo.getRegClass(LI->second);
-        TII->copyRegToReg(*MF.begin(), MF.begin()->end(), LI->second,
+        TII->copyRegToReg(*MF->begin(), MF->begin()->end(), LI->second,
                           LI->first, RC, RC);
       }
   }