diff options
author | Eli Friedman <eli.friedman@gmail.com> | 2016-06-11 21:48:25 +0000 |
---|---|---|
committer | Eli Friedman <eli.friedman@gmail.com> | 2016-06-11 21:48:25 +0000 |
commit | f1da33e4d3fc9797c7fb4f9ea681a2bc2254c281 (patch) | |
tree | 32d783ef43cbe5b7a1a6f91ba40f69f6cdb22213 /llvm/lib/Transforms/Utils/LoopUtils.cpp | |
parent | 2b7c02a04f465c298d008ebf8b7cc616e3d3db89 (diff) | |
download | llvm-f1da33e4d3fc9797c7fb4f9ea681a2bc2254c281.zip llvm-f1da33e4d3fc9797c7fb4f9ea681a2bc2254c281.tar.gz llvm-f1da33e4d3fc9797c7fb4f9ea681a2bc2254c281.tar.bz2 |
[LICM] Make isGuaranteedToExecute more accurate.
Summary:
Make isGuaranteedToExecute use the
isGuaranteedToTransferExecutionToSuccessor helper, and make that helper
a bit more accurate.
There's a potential performance impact here from assuming that arbitrary
calls might not return. This probably has little impact on loads and
stores to a pointer because most things alias analysis can reason about
are dereferenceable anyway. The other impacts, like less aggressive
hoisting of sdiv by a variable and less aggressive hoisting around
volatile memory operations, are unlikely to matter for real code.
This also impacts SCEV, which uses the same helper. It's a minor
improvement there because we can tell that, for example, memcpy always
returns normally. Strictly speaking, it's also introducing
a bug, but it's not any worse than everywhere else we assume readonly
functions terminate.
Fixes http://llvm.org/PR27857.
Reviewers: hfinkel, reames, chandlerc, sanjoy
Subscribers: broune, llvm-commits
Differential Revision: http://reviews.llvm.org/D21167
llvm-svn: 272489
Diffstat (limited to 'llvm/lib/Transforms/Utils/LoopUtils.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/LoopUtils.cpp | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/LoopUtils.cpp b/llvm/lib/Transforms/Utils/LoopUtils.cpp index 3009313..3902c67 100644 --- a/llvm/lib/Transforms/Utils/LoopUtils.cpp +++ b/llvm/lib/Transforms/Utils/LoopUtils.cpp @@ -962,5 +962,8 @@ bool llvm::isGuaranteedToExecute(const Instruction &Inst, if (ExitBlocks.empty()) return false; + // FIXME: In general, we have to prove that the loop isn't an infinite loop. + // See http::llvm.org/PR24078 . (The "ExitBlocks.empty()" check above is + // just a special case of this.) return true; } |