From 58ccc0949a8c766fa729c04149cbffbc32096f59 Mon Sep 17 00:00:00 2001 From: Evgeniy Stepanov Date: Mon, 24 Apr 2017 18:25:07 +0000 Subject: Revert "Compute safety information in a much finer granularity." Use-after-free in llvm::isGuaranteedToExecute. llvm-svn: 301214 --- llvm/lib/Transforms/Utils/LoopUtils.cpp | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp') diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 062432f..175d013a 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -1044,11 +1044,21 @@ bool llvm::isGuaranteedToExecute(const Instruction &Inst, const DominatorTree *DT, const Loop *CurLoop, const LoopSafetyInfo *SafetyInfo) { // We have to check to make sure that the instruction dominates all - // of the exit points. If it doesn't, then there is a path out of the loop - // which does not execute this instruction and its not guaranteed to execute. - for (Instruction *ExitInst : SafetyInfo->EarlyExits) - if (!DT->dominates(&Inst, ExitInst)) - return false; + // of the exit blocks. If it doesn't, then there is a path out of the loop + // which does not execute this instruction, so we can't hoist it. + + // If the instruction is in the header block for the loop (which is very + // common), it is always guaranteed to dominate the exit blocks. Since this + // is a common case, and can save some work, check it now. + if (Inst.getParent() == CurLoop->getHeader()) + // If there's a throw in the header block, we can't guarantee we'll reach + // Inst. + return !SafetyInfo->HeaderMayThrow; + + // Somewhere in this loop there is an instruction which may throw and make us + // exit the loop. + if (SafetyInfo->MayThrow) + return false; // Get the exit blocks for the current loop. SmallVector ExitBlocks; @@ -1061,9 +1071,7 @@ bool llvm::isGuaranteedToExecute(const Instruction &Inst, // As a degenerate case, if the loop is statically infinite then we haven't // proven anything since there are no exit blocks. - // However, we also special case instruction from the header as the header - // is always guaranteed to execute. - if (ExitBlocks.empty() && Inst.getParent() != CurLoop->getHeader()) + if (ExitBlocks.empty()) return false; // FIXME: In general, we have to prove that the loop isn't an infinite loop. -- cgit v1.1