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 | 683747abb81a7b7711ad6cb5abf5a4227f7ab691 (patch) | |
tree | d9fdf4681f57ab80365b47db5a1a94c53ed6ca3b /lib/CodeGen/BranchFolding.cpp | |
parent | a97906b6e6e85934d6cb71ddf3ca9bb72fe66695 (diff) | |
download | external_llvm-683747abb81a7b7711ad6cb5abf5a4227f7ab691.tar.gz external_llvm-683747abb81a7b7711ad6cb5abf5a4227f7ab691.tar.bz2 external_llvm-683747abb81a7b7711ad6cb5abf5a4227f7ab691.zip |
Teach the branch folder to update debug info if it removes blocks with line
# notes in it.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31026 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/BranchFolding.cpp')
-rw-r--r-- | lib/CodeGen/BranchFolding.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
diff --git a/lib/CodeGen/BranchFolding.cpp b/lib/CodeGen/BranchFolding.cpp index 725317378c..671ffd0d8f 100644 --- a/lib/CodeGen/BranchFolding.cpp +++ b/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; |