aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/LoopUtils.cpp
diff options
context:
space:
mode:
authorEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-04-24 18:25:07 +0000
committerEvgeniy Stepanov <eugeni.stepanov@gmail.com>2017-04-24 18:25:07 +0000
commit58ccc0949a8c766fa729c04149cbffbc32096f59 (patch)
tree8e4a7b1c7e1f6dd4817cd2854c520ef2cb7a362f /llvm/lib/Transforms/Utils/LoopUtils.cpp
parent0889225f51791cb4e8219a9dd96c3144122348ec (diff)
downloadllvm-58ccc0949a8c766fa729c04149cbffbc32096f59.zip
llvm-58ccc0949a8c766fa729c04149cbffbc32096f59.tar.gz
llvm-58ccc0949a8c766fa729c04149cbffbc32096f59.tar.bz2
Revert "Compute safety information in a much finer granularity."
Use-after-free in llvm::isGuaranteedToExecute. llvm-svn: 301214
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/LoopUtils.cpp24
1 files changed, 16 insertions, 8 deletions
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<BasicBlock *, 8> 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.