diff options
Diffstat (limited to 'lib/Transforms/Scalar/LoopUnswitch.cpp')
-rw-r--r-- | lib/Transforms/Scalar/LoopUnswitch.cpp | 26 |
1 files changed, 14 insertions, 12 deletions
diff --git a/lib/Transforms/Scalar/LoopUnswitch.cpp b/lib/Transforms/Scalar/LoopUnswitch.cpp index 4a089dfa7dbf..b5b8e720069c 100644 --- a/lib/Transforms/Scalar/LoopUnswitch.cpp +++ b/lib/Transforms/Scalar/LoopUnswitch.cpp @@ -1,9 +1,8 @@ //===- LoopUnswitch.cpp - Hoist loop-invariant conditionals in loop -------===// // -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// // @@ -658,7 +657,7 @@ bool LoopUnswitch::processCurrentLoop() { } // Do not do non-trivial unswitch while optimizing for size. - // FIXME: Use Function::optForSize(). + // FIXME: Use Function::hasOptSize(). if (OptimizeForSize || loopHeader->getParent()->hasFnAttribute(Attribute::OptimizeForSize)) return false; @@ -1405,8 +1404,8 @@ static void RemoveFromWorklist(Instruction *I, /// When we find that I really equals V, remove I from the /// program, replacing all uses with V and update the worklist. static void ReplaceUsesOfWith(Instruction *I, Value *V, - std::vector<Instruction*> &Worklist, - Loop *L, LPPassManager *LPM) { + std::vector<Instruction *> &Worklist, Loop *L, + LPPassManager *LPM, MemorySSAUpdater *MSSAU) { LLVM_DEBUG(dbgs() << "Replace with '" << *V << "': " << *I << "\n"); // Add uses to the worklist, which may be dead now. @@ -1420,8 +1419,11 @@ static void ReplaceUsesOfWith(Instruction *I, Value *V, LPM->deleteSimpleAnalysisValue(I, L); RemoveFromWorklist(I, Worklist); I->replaceAllUsesWith(V); - if (!I->mayHaveSideEffects()) + if (!I->mayHaveSideEffects()) { + if (MSSAU) + MSSAU->removeMemoryAccess(I); I->eraseFromParent(); + } ++NumSimplify; } @@ -1548,8 +1550,7 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC, ConstantInt::getTrue(Context), NewSISucc); // Release the PHI operands for this edge. for (PHINode &PN : NewSISucc->phis()) - PN.setIncomingValue(PN.getBasicBlockIndex(Switch), - UndefValue::get(PN.getType())); + PN.setIncomingValueForBlock(Switch, UndefValue::get(PN.getType())); // Tell the domtree about the new block. We don't fully update the // domtree here -- instead we force it to do a full recomputation // after the pass is complete -- but we do need to inform it of @@ -1596,7 +1597,7 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) { // 'false'. TODO: update the domtree properly so we can pass it here. if (Value *V = SimplifyInstruction(I, DL)) if (LI->replacementPreservesLCSSAForm(I, V)) { - ReplaceUsesOfWith(I, V, Worklist, L, LPM); + ReplaceUsesOfWith(I, V, Worklist, L, LPM, MSSAU.get()); continue; } @@ -1616,7 +1617,8 @@ void LoopUnswitch::SimplifyCode(std::vector<Instruction*> &Worklist, Loop *L) { // Resolve any single entry PHI nodes in Succ. while (PHINode *PN = dyn_cast<PHINode>(Succ->begin())) - ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist, L, LPM); + ReplaceUsesOfWith(PN, PN->getIncomingValue(0), Worklist, L, LPM, + MSSAU.get()); // If Succ has any successors with PHI nodes, update them to have // entries coming from Pred instead of Succ. |