diff options
author | Evan Cheng <evan.cheng@apple.com> | 2008-01-30 19:35:32 +0000 |
---|---|---|
committer | Evan Cheng <evan.cheng@apple.com> | 2008-01-30 19:35:32 +0000 |
commit | 6b2cf285bd43fdc98ca68df477570ef6938d4fb2 (patch) | |
tree | 704009214219b39241dc4d9f8f7157f80030e7d1 | |
parent | 59c8d8ae892f8c9e7ab4054d6be3efd0b66a7e4f (diff) | |
download | external_llvm-6b2cf285bd43fdc98ca68df477570ef6938d4fb2.zip external_llvm-6b2cf285bd43fdc98ca68df477570ef6938d4fb2.tar.gz external_llvm-6b2cf285bd43fdc98ca68df477570ef6938d4fb2.tar.bz2 |
A semi-gross fix for a debug info issue. When inserting the "function start" label (i.e. first label in the entry block) take care to insert it at the beginning of the block.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46568 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/CodeGen/ScheduleDAG.h | 2 | ||||
-rw-r--r-- | lib/CodeGen/SelectionDAG/ScheduleDAG.cpp | 35 |
2 files changed, 28 insertions, 9 deletions
diff --git a/include/llvm/CodeGen/ScheduleDAG.h b/include/llvm/CodeGen/ScheduleDAG.h index 37c0a90..77d1a1c 100644 --- a/include/llvm/CodeGen/ScheduleDAG.h +++ b/include/llvm/CodeGen/ScheduleDAG.h @@ -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 diff --git a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp index 543a9fb..1b53bed 100644 --- a/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp +++ b/lib/CodeGen/SelectionDAG/ScheduleDAG.cpp @@ -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); } } |