patch to update the line number information in pass -mem2reg.
authorZhou Sheng <zhousheng00@gmail.com>
Fri, 20 Feb 2009 16:31:35 +0000 (16:31 +0000)
committerZhou Sheng <zhousheng00@gmail.com>
Fri, 20 Feb 2009 16:31:35 +0000 (16:31 +0000)
Currently this pass will delete the variable declaration info,
and keep the line number info. But the kept line number info is not updated,
and some is redundant or not correct, this patch just updates those info.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@65123 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/Utils/Mem2Reg.cpp

index 2b06d778e14526e7cf1e114341494ec8cb8b9b1d..33fcd8c486074792b3ff8d036c9702c75a0ae182 100644 (file)
@@ -16,6 +16,7 @@
 #include "llvm/Transforms/Scalar.h"
 #include "llvm/Transforms/Utils/PromoteMemToReg.h"
 #include "llvm/Transforms/Utils/UnifyFunctionExitNodes.h"
+#include "llvm/IntrinsicInst.h"
 #include "llvm/Analysis/Dominators.h"
 #include "llvm/Instructions.h"
 #include "llvm/Function.h"
@@ -53,6 +54,30 @@ namespace {
 char PromotePass::ID = 0;
 static RegisterPass<PromotePass> X("mem2reg", "Promote Memory to Register");
 
+/// Remove the invalid or redundant debug information.
+static void CleanDbgInfo(Function& F) {
+  std::vector<Instruction*> DeadDbgs;
+  for (Function::iterator BBI = F.begin(), BBE = F.end(); BBI != BBE; ++BBI) {
+    if (BBI->size() <= 1)
+      continue;
+    for (BasicBlock::iterator I = BBI->begin(), E = BBI->getTerminator(); 
+         I != E; ++I) {
+      BasicBlock::iterator NextI = I;
+      ++NextI;
+      if (isa<DbgStopPointInst>(I) && isa<DbgStopPointInst>(NextI))
+        DeadDbgs.push_back(I);
+      else if (isa<DbgStopPointInst>(I) && isa<BranchInst>(NextI))
+        DeadDbgs.push_back(I);
+    }
+  }
+
+  while (!DeadDbgs.empty()) {
+    Instruction *Inst = DeadDbgs.back();
+    DeadDbgs.pop_back();
+    Inst->eraseFromParent();
+  }
+}
+
 bool PromotePass::runOnFunction(Function &F) {
   std::vector<AllocaInst*> Allocas;
 
@@ -76,6 +101,7 @@ bool PromotePass::runOnFunction(Function &F) {
     if (Allocas.empty()) break;
 
     PromoteMemToReg(Allocas, DT, DF);
+    CleanDbgInfo(F);
     NumPromoted += Allocas.size();
     Changed = true;
   }