aboutsummaryrefslogtreecommitdiffstats
path: root/lib/CodeGen/BranchFolding.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2006-10-17 23:17:27 +0000
committerChris Lattner <sabre@nondot.org>2006-10-17 23:17:27 +0000
commit683747abb81a7b7711ad6cb5abf5a4227f7ab691 (patch)
treed9fdf4681f57ab80365b47db5a1a94c53ed6ca3b /lib/CodeGen/BranchFolding.cpp
parenta97906b6e6e85934d6cb71ddf3ca9bb72fe66695 (diff)
downloadexternal_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.cpp25
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;