From 872bb74b0aa344224ce48699479e2b8d71fd05c1 Mon Sep 17 00:00:00 2001 From: Max Kazantsev Date: Fri, 2 Nov 2018 00:21:45 +0000 Subject: [PATCH] [NFC][LICM] Factor out instruction erasing logic This patch factors out a function that makes all required updates whenever an instruction gets erased. Differential Revision: https://reviews.llvm.org/D54011 Reviewed By: apilipenko llvm-svn: 345914 --- llvm/lib/Transforms/Scalar/LICM.cpp | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/llvm/lib/Transforms/Scalar/LICM.cpp b/llvm/lib/Transforms/Scalar/LICM.cpp index e72342b..d379808 100644 --- a/llvm/lib/Transforms/Scalar/LICM.cpp +++ b/llvm/lib/Transforms/Scalar/LICM.cpp @@ -123,6 +123,8 @@ CloneInstructionInExitBlock(Instruction &I, BasicBlock &ExitBlock, PHINode &PN, const LoopInfo *LI, const LoopSafetyInfo *SafetyInfo); +static void eraseInstruction(Instruction &I, AliasSetTracker *AST); + namespace { struct LoopInvariantCodeMotion { using ASTrackerMapTy = DenseMap>; @@ -404,8 +406,7 @@ bool llvm::sinkRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI, LLVM_DEBUG(dbgs() << "LICM deleting dead inst: " << I << '\n'); salvageDebugInfo(I); ++II; - CurAST->deleteValue(&I); - I.eraseFromParent(); + eraseInstruction(I, CurAST); Changed = true; continue; } @@ -422,8 +423,7 @@ bool llvm::sinkRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI, if (sink(I, LI, DT, CurLoop, SafetyInfo, ORE, FreeInLoop)) { if (!FreeInLoop) { ++II; - CurAST->deleteValue(&I); - I.eraseFromParent(); + eraseInstruction(I, CurAST); } Changed = true; } @@ -480,10 +480,8 @@ bool llvm::hoistRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI, << '\n'); CurAST->copyValue(&I, C); I.replaceAllUsesWith(C); - if (isInstructionTriviallyDead(&I, TLI)) { - CurAST->deleteValue(&I); - I.eraseFromParent(); - } + if (isInstructionTriviallyDead(&I, TLI)) + eraseInstruction(I, CurAST); Changed = true; continue; } @@ -519,7 +517,7 @@ bool llvm::hoistRegion(DomTreeNode *N, AliasAnalysis *AA, LoopInfo *LI, Product->setFastMathFlags(I.getFastMathFlags()); Product->insertAfter(&I); I.replaceAllUsesWith(Product); - I.eraseFromParent(); + eraseInstruction(I, CurAST); hoist(*ReciprocalDivisor, DT, CurLoop, SafetyInfo, ORE); Changed = true; @@ -888,6 +886,12 @@ CloneInstructionInExitBlock(Instruction &I, BasicBlock &ExitBlock, PHINode &PN, return New; } +static void eraseInstruction(Instruction &I, AliasSetTracker *AST) { + if (AST) + AST->deleteValue(&I); + I.eraseFromParent(); +} + static Instruction *sinkThroughTriviallyReplaceablePHI( PHINode *TPN, Instruction *I, LoopInfo *LI, SmallDenseMap &SunkCopies, @@ -1086,7 +1090,7 @@ static bool sink(Instruction &I, LoopInfo *LI, DominatorTree *DT, Instruction *New = sinkThroughTriviallyReplaceablePHI(PN, &I, LI, SunkCopies, SafetyInfo, CurLoop); PN->replaceAllUsesWith(New); - PN->eraseFromParent(); + eraseInstruction(*PN, nullptr); Changed = true; } return Changed; @@ -1516,7 +1520,7 @@ bool llvm::promoteLoopAccessesToScalars( // If the SSAUpdater didn't use the load in the preheader, just zap it now. if (PreheaderLoad->use_empty()) - PreheaderLoad->eraseFromParent(); + eraseInstruction(*PreheaderLoad, CurAST); return true; } -- 2.7.4