From 1a1ed69435121fe45a0ea7e4661b812c35e94713 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 29 Aug 2010 18:00:00 +0000 Subject: [PATCH] fix some bugs (found by inspection) where LICM would not update LICM correctly. When sinking an instruction, it should not add entries for the sunk instruction to the AST, it should remove the entry for the sunk instruction. The blocks being sunk to are not in the loop, so their instructions shouldn't be in the AST (yet)! llvm-svn: 112447 --- llvm/lib/Transforms/Scalar/LICM.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index 44dfed8ed4ec..e6a8b2d572ea 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -530,7 +530,6 @@ void LICM::sink(Instruction &I) { New = &I; } else { New = I.clone(); - CurAST->copyValue(&I, New); if (!I.getName().empty()) New->setName(I.getName()+".le"); ExitBlock->getInstList().insert(InsertPt, New); @@ -563,6 +562,9 @@ void LICM::sink(Instruction &I) { if (I.getType()->isPointerTy()) for (unsigned i = 0, e = NewPHIs.size(); i != e; ++i) CurAST->copyValue(NewPHIs[i], &I); + + // Finally, remove the instruction from CurAST. It is no longer in the loop. + CurAST->deleteValue(&I); } /// hoist - When an instruction is found to only use loop invariant operands