aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Transforms/Utils/Mem2Reg.cpp
diff options
context:
space:
mode:
authorZhou Sheng <zhousheng00@gmail.com>2009-02-20 16:31:35 +0000
committerZhou Sheng <zhousheng00@gmail.com>2009-02-20 16:31:35 +0000
commit149adaf590fb7e58a5a5ac457c4ab52a3a5121fc (patch)
treec57046184d8ec8408ce15e3b23c8e3d5e88e622f /lib/Transforms/Utils/Mem2Reg.cpp
parent83ecf4f7e96d2e76b8e135a06176054ec8575483 (diff)
downloadexternal_llvm-149adaf590fb7e58a5a5ac457c4ab52a3a5121fc.tar.gz
external_llvm-149adaf590fb7e58a5a5ac457c4ab52a3a5121fc.tar.bz2
external_llvm-149adaf590fb7e58a5a5ac457c4ab52a3a5121fc.zip
patch to update the line number information in pass -mem2reg.
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
Diffstat (limited to 'lib/Transforms/Utils/Mem2Reg.cpp')
-rw-r--r--lib/Transforms/Utils/Mem2Reg.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/lib/Transforms/Utils/Mem2Reg.cpp b/lib/Transforms/Utils/Mem2Reg.cpp
index 2b06d778e1..33fcd8c486 100644
--- a/lib/Transforms/Utils/Mem2Reg.cpp
+++ b/lib/Transforms/Utils/Mem2Reg.cpp
@@ -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;
}