diff options
author | Chris Lattner <sabre@nondot.org> | 2006-10-17 23:17:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-10-17 23:17:27 +0000 |
commit | 73da320e50dbaa5b6208176bcc7a44883b29de21 (patch) | |
tree | 0efc97414ae782c3c9f6bc0ffd85ca47bce7d1b9 /llvm/lib/CodeGen/BranchFolding.cpp | |
parent | 34136d0cc18cef93bb03b4f186f94790b362d3a7 (diff) | |
download | bcm5719-llvm-73da320e50dbaa5b6208176bcc7a44883b29de21.tar.gz bcm5719-llvm-73da320e50dbaa5b6208176bcc7a44883b29de21.zip |
Teach the branch folder to update debug info if it removes blocks with line
# notes in it.
llvm-svn: 31026
Diffstat (limited to 'llvm/lib/CodeGen/BranchFolding.cpp')
-rw-r--r-- | llvm/lib/CodeGen/BranchFolding.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/llvm/lib/CodeGen/BranchFolding.cpp b/llvm/lib/CodeGen/BranchFolding.cpp index 725317378c4..671ffd0d8f7 100644 --- a/llvm/lib/CodeGen/BranchFolding.cpp +++ b/llvm/lib/CodeGen/BranchFolding.cpp @@ -17,6 +17,7 @@ //===----------------------------------------------------------------------===// #include "llvm/CodeGen/Passes.h" +#include "llvm/CodeGen/MachineDebugInfo.h" #include "llvm/CodeGen/MachineFunctionPass.h" #include "llvm/CodeGen/MachineJumpTableInfo.h" #include "llvm/Target/TargetInstrInfo.h" @@ -29,9 +30,11 @@ namespace { virtual bool runOnMachineFunction(MachineFunction &MF); virtual const char *getPassName() const { return "Control Flow Optimizer"; } const TargetInstrInfo *TII; + MachineDebugInfo *MDI; bool MadeChange; private: void OptimizeBlock(MachineFunction::iterator MBB); + void RemoveDeadBlock(MachineBasicBlock *MBB); }; } @@ -39,12 +42,30 @@ FunctionPass *llvm::createBranchFoldingPass() { return new BranchFolder(); } /// RemoveDeadBlock - Remove the specified dead machine basic block from the /// function, updating the CFG. -static void RemoveDeadBlock(MachineBasicBlock *MBB) { +void BranchFolder::RemoveDeadBlock(MachineBasicBlock *MBB) { assert(MBB->pred_empty() && "MBB must be dead!"); + MachineFunction *MF = MBB->getParent(); // drop all successors. while (!MBB->succ_empty()) MBB->removeSuccessor(MBB->succ_end()-1); + + // If there is DWARF info to active, check to see if there are any DWARF_LABEL + // records in the basic block. If so, unregister them from MachineDebugInfo. + if (MDI && !MBB->empty()) { + unsigned DWARF_LABELOpc = TII->getDWARF_LABELOpcode(); + assert(DWARF_LABELOpc && + "Target supports dwarf but didn't implement getDWARF_LABELOpcode!"); + + for (MachineBasicBlock::iterator I = MBB->begin(), E = MBB->end(); + I != E; ++I) { + if ((unsigned)I->getOpcode() == DWARF_LABELOpc) { + // The label ID # is always operand #0, an immediate. + MDI->RemoveLabelInfo(I->getOperand(0).getImm()); + } + } + } + // Remove the block. MF->getBasicBlockList().erase(MBB); } @@ -53,7 +74,7 @@ bool BranchFolder::runOnMachineFunction(MachineFunction &MF) { TII = MF.getTarget().getInstrInfo(); if (!TII) return false; - //MF.dump(); + MDI = getAnalysisToUpdate<MachineDebugInfo>(); bool EverMadeChange = false; MadeChange = true; |