<div dir="ltr">Grrr. A typo. Please, read: there's nothing wrong with the code (Chandler's CL) *AND* the remedy would be ...</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 11, 2017 at 3:51 PM, Ivan Krasin <span dir="ltr"><<a href="mailto:krasin@google.com" target="_blank">krasin@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Mike,<div><br></div><div>this is a known and fixed issue in libstdc++: <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60734" target="_blank">https://gcc.gnu.<wbr>org/bugzilla/show_bug.cgi?id=<wbr>60734</a></div><div>There's nothing wrong with the code in the remedy would be to upgrade buildbots to newer Ubuntu (16.04) which have this undefined behavior fixed.</div><div>This work is in the progress. ETA: end of day.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 11, 2017 at 3:49 PM, Mike Aizatsky <span dir="ltr"><<a href="mailto:aizatsky@google.com" target="_blank">aizatsky@google.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Chandler,<div><br></div><div>Looks like ubsan complains about this change:</div><div><br></div><div><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/2034" target="_blank">http://lab.llvm.org:8011/build<wbr>ers/sanitizer-x86_64-linux-<wbr>fast/builds/2034</a><br></div><div><br></div><div><div>[ RUN ] LoopPassManagerTest.FunctionPa<wbr>ssInvalidationOfLoopAnalyses</div><div>/usr/lib/gcc/x86_64-linux-gnu/<wbr>4.9/../../../../include/c++/4.<wbr>9/bits/stl_tree.h:1540:28: runtime error: upcast of address 0x00000366a0d0 with insufficient space for an object of type 'std::_Rb_tree_node<std::pair<<wbr>const void *const, testing::(anonymous namespace)::MockObjectState> >'</div><div>0x00000366a0d0: note: pointer points here</div><div> 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 d0 a0 66 03 00 00 00 00 d0 a0 66 03</div><div> ^ </div><div> #0 0xc4d1b7 in std::_Rb_tree<void const*, std::pair<void const* const, testing::(anonymous namespace)::MockObjectState>, std::_Select1st<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> >, std::less<void const*>, std::allocator<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> > >::_M_get_insert_hint_unique_p<wbr>os(std::_Rb_tree_const_iterato<wbr>r<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> >, void const* const&) /usr/lib/gcc/x86_64-linux-gnu/<wbr>4.9/../../../../include/c++/4.<wbr>9/bits/stl_tree.h:1540:28</div><div> #1 0xc4ce76 in std::_Rb_tree_iterator<std::pa<wbr>ir<void const* const, testing::(anonymous namespace)::MockObjectState> > std::_Rb_tree<void const*, std::pair<void const* const, testing::(anonymous namespace)::MockObjectState>, std::_Select1st<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> >, std::less<void const*>, std::allocator<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> > >::_M_emplace_hint_unique<std:<wbr>:piecewise_construct_t const&, std::tuple<void const* const&>, std::tuple<> >(std::_Rb_tree_const_iterator<wbr><std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> >, std::piecewise_construct_t const&, std::tuple<void const* const&>&&, std::tuple<>&&) /usr/lib/gcc/x86_64-linux-gnu/<wbr>4.9/../../../../include/c++/4.<wbr>9/bits/stl_tree.h:1794:19</div><div> #2 0xc4b713 in std::map<void const*, testing::(anonymous namespace)::MockObjectState, std::less<void const*>, std::allocator<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> > >::operator[](void const* const&) /usr/lib/gcc/x86_64-linux-gnu/<wbr>4.9/../../../../include/c++/4.<wbr>9/bits/stl_map.h:500:15</div><div> #3 0xc4a2d8 in testing::Mock::Register(void const*, testing::internal::UntypedFunc<wbr>tionMockerBase*) /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googlemoc<wbr>k/src/gmock-spec-builders.cc:<wbr>715:3</div><div> #4 0xc4a27c in testing::internal::UntypedFunc<wbr>tionMockerBase::RegisterOwner(<wbr>void const*) /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googlemoc<wbr>k/src/gmock-spec-builders.cc:<wbr>285:3</div><div> #5 0x4efbc9 in (anonymous namespace)::MockLoopAnalysisHa<wbr>ndleTemplate<<wbr>18446744073709551615ul>::gmock<wbr>_run(testing::Matcher<llvm::<wbr>Loop&> const&, testing::Matcher<llvm::Analysi<wbr>sManager<llvm::Loop, llvm::LoopStandardAnalysisResu<wbr>lts&>&> const&, testing::Matcher<llvm::LoopSta<wbr>ndardAnalysisResults&> const&) /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/unittests/Analysis/LoopP<wbr>assManagerTest.cpp:120:3</div><div> #6 0x4ed31b in (anonymous namespace)::MockAnalysisHandle<wbr>Base<(anonymous namespace)::MockLoopAnalysisHa<wbr>ndleTemplate<<wbr>18446744073709551615ul>, llvm::Loop, llvm::AnalysisManager<llvm::Lo<wbr>op, llvm::LoopStandardAnalysisResu<wbr>lts&>, llvm::LoopStandardAnalysisResu<wbr>lts&>::setDefaults() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/unittests/Analysis/LoopP<wbr>assManagerTest.cpp:82:5</div><div> #7 0x4eb262 in (anonymous namespace)::LoopPassManagerTes<wbr>t::LoopPassManagerTest() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/unittests/Analysis/LoopP<wbr>assManagerTest.cpp:242:3</div><div> #8 0x4f44ba in (anonymous namespace)::LoopPassManagerTes<wbr>t_FunctionPassInvalidationOfLo<wbr>opAnalyses_Test::LoopPassManag<wbr>erTest_FunctionPassInvalidatio<wbr>nOfLoopAnalyses_Test() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/unittests/Analysis/LoopP<wbr>assManagerTest.cpp:346:1</div><div> #9 0x4f447f in testing::internal::TestFactory<wbr>Impl<(anonymous namespace)::LoopPassManagerTes<wbr>t_FunctionPassInvalidationOfLo<wbr>opAnalyses_Test>::CreateTest() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googletes<wbr>t/include/gtest/internal/<wbr>gtest-internal.h:484:43</div><div> #10 0xc15510 in testing::TestInfo::Run() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googletes<wbr>t/src/gtest.cc:2647:22</div><div> #11 0xc15c32 in testing::TestCase::Run() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googletes<wbr>t/src/gtest.cc:2774:28</div><div> #12 0xc1c013 in testing::internal::UnitTestImp<wbr>l::RunAllTests() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googletes<wbr>t/src/gtest.cc:4649:43</div><div> #13 0xc1bcab in testing::UnitTest::Run() /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/googletes<wbr>t/src/gtest.cc:4257:10</div><div> #14 0xc0aef3 in main /mnt/b/sanitizer-buildbot3/san<wbr>itizer-x86_64-linux-fast/build<wbr>/llvm/utils/unittest/UnitTestM<wbr>ain/TestMain.cpp:51:10</div><div> #15 0x7fe430cb6f44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so<wbr>.6+0x21f44)</div><div> #16 0x414903 in _start (/mnt/b/sanitizer-buildbot3/sa<wbr>nitizer-x86_64-linux-fast/buil<wbr>d/llvm_build_ubsan/unittests/<wbr>Analysis/AnalysisTests+<wbr>0x414903)</div><div><br></div><div><br></div><br><div class="gmail_quote"><div dir="ltr">On Tue, Jan 10, 2017 at 10:34 PM Chandler Carruth via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: chandlerc<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Date: Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
New Revision: 291651<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=291651&view=rev" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject?rev=291651&view=rev</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Log:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
[PM] Rewrite the loop pass manager to use a worklist and augmented run<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
arguments much like the CGSCC pass manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
This is a major redesign following the pattern establish for the CGSCC layer to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
support updates to the set of loops during the traversal of the loop nest and<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
to support invalidation of analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
An additional significant burden in the loop PM is that so many passes require<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
access to a large number of function analyses. Manually ensuring these are<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
cached, available, and preserved has been a long-standing burden in LLVM even<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
with the help of the automatic scheduling in the old pass manager. And it made<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
the new pass manager extremely unweildy. With this design, we can package the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
common analyses up while in a function pass and make them immediately available<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
to all the loop passes. While in some cases this is unnecessary, I think the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
simplicity afforded is worth it.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
This does not (yet) address loop simplified form or LCSSA form, but those are<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
the next things on my radar and I have a clear plan for them.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
While the patch is very large, most of it is either mechanically updating loop<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
passes to the new API or the new testing for the loop PM. The code for it is<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
reasonably compact.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
I have not yet updated all of the loop passes to correctly leverage the update<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
mechanisms demonstrated in the unittests. I'll do that in follow-up patches<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
along with improved FileCheck tests for those passes that ensure things work in<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
more realistic scenarios. In many cases, there isn't much we can do with these<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
until the loop simplified form and LCSSA form are in place.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Differential Revision: <a href="https://reviews.llvm.org/D28292" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">https://reviews.llvm.org/D2829<wbr>2</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Analys<wbr>is/IVUsers.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Analys<wbr>is/LoopAccessAnalysis.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Analys<wbr>is/LoopInfo.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Analys<wbr>is/LoopPassManager.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/IndVarSimplify.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LICM.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopDeletion.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopIdiomRecognize<wbr>.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopInstSimplify.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopRotation.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopSimplifyCFG.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopStrengthReduce<wbr>.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopUnrollPass.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Analysis/IVUser<wbr>s.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Analysis/LoopAc<wbr>cessAnalysis.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Analysis/LoopIn<wbr>fo.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Analysis/LoopPa<wbr>ss.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Analysis/LoopPa<wbr>ssManager.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Passes/PassBuil<wbr>der.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/IndVarSimplify.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LICM.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDeletion.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDistribute.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopIdiomRecognize.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopInstSimplify.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopRotation.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopSimplifyCFG.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopStrengthReduce.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopUnrollPass.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/lib/Transforms/Vect<wbr>orize/LoopVectorize.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/test/Other/loop-pas<wbr>s-ordering.ll<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/test/Other/new-pass<wbr>-manager.ll<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/test/Other/pass-pip<wbr>eline-parsing.ll<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
llvm/trunk/unittests/Analysis/<wbr>LoopPassManagerTest.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Analys<wbr>is/IVUsers.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/IVUsers.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Analysis/IVUsers.h?rev=291651&<wbr>r1=291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr>is/IVUsers.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr>is/IVUsers.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -193,7 +193,8 @@ class IVUsersAnalysis : public AnalysisI<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
typedef IVUsers Result;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- IVUsers run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ IVUsers run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Printer pass for the \c IVUsers for a loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -202,7 +203,8 @@ class IVUsersPrinterPass : public PassIn<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
explicit IVUsersPrinterPass(raw_ostream &OS) : OS(OS) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Analys<wbr>is/LoopAccessAnalysis.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopAccessAnalysis.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Analysis/LoopAccessAnalysis.h?<wbr>rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr>is/LoopAccessAnalysis.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr>is/LoopAccessAnalysis.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -753,8 +753,8 @@ class LoopAccessAnalysis<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
typedef LoopAccessInfo Result;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Result run(Loop &, LoopAnalysisManager &);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- static StringRef name() { return "LoopAccessAnalysis"; }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Result run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// \brief Printer pass for the \c LoopAccessInfo results.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -764,7 +764,8 @@ class LoopAccessInfoPrinterPass<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
explicit LoopAccessInfoPrinterPass(raw_<wbr>ostream &OS) : OS(OS) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
inline Instruction *MemoryDepChecker::Dependence:<wbr>:getSource(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Analys<wbr>is/LoopInfo.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopInfo.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Analysis/LoopInfo.h?rev=291651<wbr>&r1=291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr>is/LoopInfo.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr>is/LoopInfo.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -853,17 +853,8 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
void getAnalysisUsage(AnalysisUsage &AU) const override;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// \brief Pass for printing a loop's contents as LLVM's text IR assembly.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-class PrintLoopPass : public PassInfoMixin<PrintLoopPass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- raw_ostream &OS;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- std::string Banner;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PrintLoopPass();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PrintLoopPass(raw_ostream &OS, const std::string &Banner = "");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, AnalysisManager<Loop> &);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// Function to print a loop's contents as LLVM's text IR assembly.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+void printLoop(Loop &L, raw_ostream &OS, const std::string &Banner = "");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // End llvm namespace<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Analys<wbr>is/LoopPassManager.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Analysis/LoopPassManager.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Analysis/LoopPassManager.h?<wbr>rev=291651&r1=291650&r2=291651<wbr>&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr>is/LoopPassManager.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr>is/LoopPassManager.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -8,63 +8,342 @@<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
//===------------------------<wbr>------------------------------<wbr>----------------===//<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// \file<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// This header provides classes for managing passes over loops in LLVM IR.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// This header provides classes for managing a pipeline of passes over loops<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// in LLVM IR.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// The primary loop pass pipeline is managed in a very particular way to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// provide a set of core guarantees:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// 1) Loops are, where possible, in simplified form.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// 2) Loops are *always* in LCSSA form.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// 3) A collection of Loop-specific analysis results are available:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// - LoopInfo<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// - DominatorTree<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// - ScalarEvolution<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// - AAManager<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// 4) All loop passes preserve #1 (where possible), #2, and #3.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// 5) Loop passes run over each loop in the loop nest from the innermost to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// the outermost. Specifically, all inner loops are processed before<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// passes run over outer loops. When running the pipeline across an inner<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// loop creates new inner loops, those are added and processed in this<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// order as well.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// This process is designed to facilitate transformations which simplify,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// reduce, and remove loops. For passes which are more oriented towards<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// optimizing loops, especially optimizing loop *nests* instead of single<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// loops in isolation, this framework is less interesting.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
//===------------------------<wbr>------------------------------<wbr>----------------===//<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#ifndef LLVM_ANALYSIS_LOOPPASSMANAGER_<wbr>H<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#define LLVM_ANALYSIS_LOOPPASSMANAGER_<wbr>H<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/ADT/PostOrderIterator.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/ADT/PriorityWorklist.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/ADT/STLExtras.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/AliasAnalysis.h<wbr>"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/BasicAliasAnaly<wbr>sis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/GlobalsModRef.h<wbr>"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/LoopInfo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/ScalarEvolution<wbr>.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/ScalarEvolution<wbr>AliasAnalysis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/TargetLibraryIn<wbr>fo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/TargetTransform<wbr>Info.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/IR/Dominators.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/IR/PassManager.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-extern template class PassManager<Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// \brief The loop pass manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// See the documentation for the PassManager template for details. It runs a<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// sequency of loop passes over each loop that the manager is run over. This<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// typedef serves as a convenient way to refer to this construct.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-typedef PassManager<Loop> LoopPassManager;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+// Forward declarations of a update tracking and analysis result tracking<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+// structures used in the API of loop passes that work within this<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+// infrastructure.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+class LPMUpdater;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+struct LoopStandardAnalysisResults;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-extern template class AnalysisManager<Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// Extern template declaration for the analysis set for this IR unit.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+extern template class AllAnalysesOn<Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+extern template class AnalysisManager<Loop, LoopStandardAnalysisResults &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// \brief The loop analysis manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// See the documentation for the AnalysisManager template for detail<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// documentation. This typedef serves as a convenient way to refer to this<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// construct in the adaptors and proxies used to integrate this into the larger<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// pass manager infrastructure.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-typedef AnalysisManager<Loop> LoopAnalysisManager;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+typedef AnalysisManager<Loop, LoopStandardAnalysisResults &><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopAnalysisManager;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+// Explicit specialization and instantiation declarations for the pass manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+// See the comments on the definition of the specialization for details on how<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+// it differs from the primary template.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &>::run(Loop &InitialL, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AnalysisResults,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+extern template class PassManager<Loop, LoopAnalysisManager,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// \brief The Loop pass manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// See the documentation for the PassManager template for details. It runs<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// a sequence of Loop passes over each Loop that the manager is run over. This<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// typedef serves as a convenient way to refer to this construct.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+typedef PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopPassManager;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// A partial specialization of the require analysis template pass to forward<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// the extra parameters from a transformation's run method to the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// AnalysisManager's getResult.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <typename AnalysisT><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+struct RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ : PassInfoMixin<<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &>> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ (void)AM.template getResult<AnalysisT>(L, AR);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// An alias template to easily name a require analysis loop pass.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <typename AnalysisT><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+using RequireAnalysisLoopPass =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// A proxy from a \c LoopAnalysisManager to a \c Function.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
typedef InnerAnalysisManagerProxy<Loop<wbr>AnalysisManager, Function><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopAnalysisManagerFunctionPr<wbr>oxy;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// Specialization of the invalidate method for the \c<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-/// LoopAnalysisManagerFunctionPro<wbr>xy's result.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// A specialized result for the \c LoopAnalysisManagerFunctionPro<wbr>xy which<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// retains a \c LoopInfo reference.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// This allows it to collect loop objects for which analysis results may be<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// cached in the \c LoopAnalysisManager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <> class LoopAnalysisManagerFunctionPro<wbr>xy::Result {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ explicit Result(LoopAnalysisManager &InnerAM, LoopInfo &LI)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ : InnerAM(&InnerAM), LI(&LI) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Result(Result &&Arg) : InnerAM(std::move(Arg.InnerAM)<wbr>), LI(Arg.LI) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We have to null out the analysis manager in the moved-from state<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // because we are taking ownership of the responsibilty to clear the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // analysis state.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Arg.InnerAM = nullptr;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Result &operator=(Result &&RHS) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM = RHS.InnerAM;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LI = <a href="http://RHS.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">RHS.LI</a>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We have to null out the analysis manager in the moved-from state<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // because we are taking ownership of the responsibilty to clear the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // analysis state.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ RHS.InnerAM = nullptr;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return *this;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ~Result() {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // InnerAM is cleared in a moved from state where there is nothing to do.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!InnerAM)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Clear out the analysis manager if we're being destroyed -- it means we<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // didn't even see an invalidate call when we got invalidated.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM->clear();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// Accessor for the analysis manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopAnalysisManager &getManager() { return *InnerAM; }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// Handler for invalidation of the proxy for a particular function.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// If the proxy, \c LoopInfo, and associated analyses are preserved, this<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// will merely forward the invalidation event to any cached loop analysis<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// results for loops within this function.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// If the necessary loop infrastructure is not preserved, this will forcibly<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// clear all of the cached analysis results that are keyed on the \c<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// LoopInfo for this function.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ bool invalidate(Function &F, const PreservedAnalyses &PA,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ FunctionAnalysisManager::Inval<wbr>idator &Inv);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+private:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopAnalysisManager *InnerAM;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopInfo *LI;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// Provide a specialized run method for the \c LoopAnalysisManagerFunctionPro<wbr>xy<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// so it can pass the \c LoopInfo to the result.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
template <><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-bool LoopAnalysisManagerFunctionPro<wbr>xy::Result::invalidate(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function &F, const PreservedAnalyses &PA,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- FunctionAnalysisManager::Inval<wbr>idator &Inv);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr>oxy::Result<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr>oxy::run(Function &F, FunctionAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// Ensure the \c LoopAnalysisManagerFunctionPro<wbr>xy is provided as an extern<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// template.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
extern template class InnerAnalysisManagerProxy<Loop<wbr>AnalysisManager, Function>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-extern template class OuterAnalysisManagerProxy<Func<wbr>tionAnalysisManager, Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+extern template class OuterAnalysisManagerProxy<Func<wbr>tionAnalysisManager, Loop,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// A proxy from a \c FunctionAnalysisManager to a \c Loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-typedef OuterAnalysisManagerProxy<Func<wbr>tionAnalysisManager, Loop><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+typedef OuterAnalysisManagerProxy<Func<wbr>tionAnalysisManager, Loop,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
FunctionAnalysisManagerLoopPr<wbr>oxy;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Returns the minimum set of Analyses that all loop passes must preserve.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PreservedAnalyses getLoopPassPreservedAnalyses()<wbr>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+namespace internal {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// Helper to implement appending of loops onto a worklist.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// We want to process loops in postorder, but the worklist is a LIFO data<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// structure, so we append to it in *reverse* postorder.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// For trees, a preorder traversal is a viable reverse postorder, so we<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// actually append using a preorder walk algorithm.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <typename RangeT><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+inline void appendLoopsToWorklist(RangeT &&Loops,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SmallPriorityWorklist<Loop *, 4> &Worklist) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We use an internal worklist to build up the preorder traversal without<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // recursion.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SmallVector<Loop *, 4> PreOrderLoops, PreOrderWorklist;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We walk the initial sequence of loops in reverse because we generally want<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // to visit defs before uses and the worklist is LIFO.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (Loop *RootL : reverse(Loops)) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ assert(PreOrderLoops.empty() && "Must start with an empty preorder walk.");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ assert(PreOrderWorklist.empty(<wbr>) &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "Must start with an empty preorder walk worklist.");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderWorklist.push_back(Roo<wbr>tL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ do {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Loop *L = PreOrderWorklist.pop_back_val(<wbr>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderWorklist.append(L->beg<wbr>in(), L->end());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderLoops.push_back(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ } while (!PreOrderWorklist.empty());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Worklist.insert(std::move(PreO<wbr>rderLoops));<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderLoops.clear();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// The adaptor from a function pass to a loop pass directly computes<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// a standard set of analyses that are especially useful to loop passes and<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// makes them available in the API. Loop passes are also expected to update<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// all of these so that they remain correct across the entire loop pipeline.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+struct LoopStandardAnalysisResults {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AAResults &AA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AssumptionCache &AC;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ DominatorTree &DT;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopInfo &LI;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ScalarEvolution &SE;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ TargetLibraryInfo &TLI;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ TargetTransformInfo &TTI;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <typename LoopPassT> class FunctionToLoopPassAdaptor;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// This class provides an interface for updating the loop pass manager based<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// on mutations to the loop nest.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// A reference to an instance of this class is passed as an argument to each<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// Loop pass, and Loop passes should use it to update LPM infrastructure if<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// they modify the loop nest structure.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+class LPMUpdater {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// This can be queried by loop passes which run other loop passes (like pass<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// managers) to know whether the loop needs to be skipped due to updates to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// the loop nest.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// If this returns true, the loop object may have been deleted, so passes<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// should take care not to touch the object.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ bool skipCurrentLoop() const { return SkipCurrentLoop; }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// Loop passes should use this method to indicate they have deleted a loop<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// from the nest.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// Note that this loop must either be the current loop or a subloop of the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// current loop. This routine must be called prior to removing the loop from<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// the loop nest.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// If this is called for the current loop, in addition to clearing any<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// state, this routine will mark that the current loop should be skipped by<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// the rest of the pass management infrastructure.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ void markLoopAsDeleted(Loop &L) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LAM.clear(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ assert(CurrentL->contains(&L) && "Cannot delete a loop outside of the "<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "subloop tree currently being processed.");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (&L == CurrentL)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SkipCurrentLoop = true;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// Loop passes should use this method to indicate they have added new child<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// loops of the current loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// \p NewChildLoops must contain only the immediate children. Any nested<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// loops within them will be visited in postorder as usual for the loop pass<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ void addChildLoops(ArrayRef<Loop *> NewChildLoops) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Insert ourselves back into the worklist first, as this loop should be<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // revisited after all the children have been processed.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Worklist.insert(CurrentL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#ifndef NDEBUG<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (Loop *NewL : NewChildLoops)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ assert(NewL->getParentLoop() == CurrentL && "All of the new loops must "<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "be immediate children of "<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "the current loop!");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#endif<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ internal::appendLoopsToWorklis<wbr>t(NewChildLoops, Worklist);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Also skip further processing of the current loop--it will be revisited<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // after all of its newly added children are accounted for.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SkipCurrentLoop = true;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// Loop passes should use this method to indicate they have added new<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// sibling loops to the current loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ ///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// \p NewSibLoops must only contain the immediate sibling loops. Any nested<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// loops within them will be visited in postorder as usual for the loop pass<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ void addSiblingLoops(ArrayRef<Loop *> NewSibLoops) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#ifndef NDEBUG<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (Loop *NewL : NewSibLoops)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ assert(NewL->getParentLoop() == ParentL &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "All of the new loops must be siblings of the current loop!");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#endif<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ internal::appendLoopsToWorklis<wbr>t(NewSibLoops, Worklist);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // No need to skip the current loop or revisit it, as sibling loops<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // shouldn't impact anything.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+private:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ template <typename LoopPassT> friend class llvm::FunctionToLoopPassAdapto<wbr>r;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// The \c FunctionToLoopPassAdaptor's worklist of loops to process.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SmallPriorityWorklist<Loop *, 4> &Worklist;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ /// The analysis manager for use in the current loop nest.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopAnalysisManager &LAM;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Loop *CurrentL;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ bool SkipCurrentLoop;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#ifndef NDEBUG<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // In debug builds we also track the parent loop to implement asserts even in<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // the face of loop deletion.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Loop *ParentL;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#endif<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater(SmallPriorityWorkli<wbr>st<Loop *, 4> &Worklist,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopAnalysisManager &LAM)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ : Worklist(Worklist), LAM(LAM) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// \brief Adaptor that maps from a function to its loops.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Designed to allow composition of a LoopPass(Manager) and a<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -87,42 +366,61 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// Get the loop structure for this function<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopInfo &LI = AM.getResult<LoopAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // Also precompute all of the function analyses used by loop passes.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // FIXME: These should be handed into the loop passes when the loop pass<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // management layer is reworked to follow the design of CGSCC.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- (void)AM.getResult<AAManager>(<wbr>F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- (void)AM.getResult<DominatorTr<wbr>eeAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- (void)AM.getResult<ScalarEvolu<wbr>tionAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- (void)AM.getResult<TargetLibra<wbr>ryAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // If there are no loops, there is nothing to do here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (LI.empty())<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Get the analysis results needed by loop passes.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults LAR = {AM.getResult<AAManager>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<AssumptionAnalys<wbr>is>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<DominatorTreeAna<wbr>lysis>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<LoopAnalysis>(F)<wbr>,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<ScalarEvolutionA<wbr>nalysis>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<TargetLibraryAna<wbr>lysis>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<TargetIRAnalysis<wbr>>(F)};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PreservedAnalyses PA = PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // We want to visit the loops in reverse post-order. We'll build the stack<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // of loops to visit in Loops by first walking the loops in pre-order.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- SmallVector<Loop *, 2> Loops;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- SmallVector<Loop *, 2> WorkList(LI.begin(), LI.end());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- while (!WorkList.empty()) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Loop *L = WorkList.pop_back_val();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- WorkList.insert(WorkList.end()<wbr>, L->begin(), L->end());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Loops.push_back(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // Now pop each element off of the stack to visit the loops in reverse<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // post-order.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- for (auto *L : reverse(Loops)) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses PassPA = Pass.run(*L, LAM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // A postorder worklist of loops to process.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SmallPriorityWorklist<Loop *, 4> Worklist;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Register the worklist and loop analysis manager so that loop passes can<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // update them when they mutate the loop nest structure.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater Updater(Worklist, LAM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Add the loop nests in the reverse order of LoopInfo. For some reason,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // they are stored in RPO w.r.t. the control flow graph in LoopInfo. For<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // the purpose of unrolling, loop deletion, and LICM, we largely want to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // work forward across the CFG so that we visit defs before uses and can<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // propagate simplifications from one loop nest into the next.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: Consider changing the order in LoopInfo.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ internal::appendLoopsToWorklis<wbr>t(reverse(LI), Worklist);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ do {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Loop *L = Worklist.pop_back_val();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Reset the update structure for this loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Updater.CurrentL = L;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Updater.SkipCurrentLoop = false;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#ifndef NDEBUG<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Updater.ParentL = L->getParentLoop();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#endif<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses PassPA = Pass.run(*L, LAM, LAR, Updater);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// FIXME: We should verify the set of analyses relevant to Loop passes<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// are preserved.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // We know that the loop pass couldn't have invalidated any other loop's<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // analyses (that's the contract of a loop pass), so directly handle the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // loop analysis manager's invalidation here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LAM.invalidate(*L, PassPA);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // If the loop hasn't been deleted, we need to handle invalidation here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!Updater.skipCurrentLoop())<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We know that the loop pass couldn't have invalidated any other<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // loop's analyses (that's the contract of a loop pass), so directly<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // handle the loop analysis manager's invalidation here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LAM.invalidate(*L, PassPA);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// Then intersect the preserved set so that invalidation of module<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// analyses will eventually occur when the module pass completes.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.intersect(std::move(PassPA<wbr>));<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ } while (!Worklist.empty());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// By definition we preserve the proxy. We also preserve all analyses on<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// Loops. This precludes *any* invalidation of loop analyses by the proxy,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -130,6 +428,17 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// loop analysis manager incrementally above.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.preserveSet<AllAnalysesOn<<wbr>Loop>>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.preserve<LoopAnalysisManag<wbr>erFunctionProxy>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We also preserve the set of standard analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<AssumptionAnalysis<wbr>>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<DominatorTreeAnaly<wbr>sis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<LoopAnalysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<ScalarEvolutionAna<wbr>lysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: What we really want to do here is preserve an AA category, but<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // that concept doesn't exist yet.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<AAManager>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<BasicAA>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<GlobalsAA>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<SCEVAA>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -144,6 +453,19 @@ FunctionToLoopPassAdaptor<Loop<wbr>PassT><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
createFunctionToLoopPassAdapt<wbr>or(LoopPassT Pass) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return FunctionToLoopPassAdaptor<Loop<wbr>PassT>(std::move(Pass));<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// \brief Pass for printing a loop's contents as textual IR.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+class PrintLoopPass : public PassInfoMixin<PrintLoopPass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ raw_ostream &OS;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ std::string Banner;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PrintLoopPass();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PrintLoopPass(raw_ostream &OS, const std::string &Banner = "");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#endif // LLVM_ANALYSIS_LOOPPASSMANAGER_<wbr>H<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/IndVarSimplify.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/IndVarSimplify.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/IndVarSimpli<wbr>fy.h?rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/IndVarSimplify.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/IndVarSimplify.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -23,7 +23,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class IndVarSimplifyPass : public PassInfoMixin<IndVarSimplifyPa<wbr>ss> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LICM.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LICM.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LICM.h?rev=<wbr>291651&r1=291650&r2=291651&<wbr>view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LICM.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LICM.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -42,7 +42,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Performs Loop Invariant Code Motion Pass.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LICMPass : public PassInfoMixin<LICMPass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // end namespace llvm<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopDeletion.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopDeletion.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopDeletion<wbr>.h?rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopDeletion.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopDeletion.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -24,7 +24,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LoopDeletionPass : public PassInfoMixin<LoopDeletionPass<wbr>> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopDeletionPass() {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
bool runImpl(Loop *L, DominatorTree &DT, ScalarEvolution &SE,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopInfo &loopInfo);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopIdiomRecognize<wbr>.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopIdiomRecognize.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopIdiomRec<wbr>ognize.h?rev=291651&r1=291650&<wbr>r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopIdiomRecognize<wbr>.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopIdiomRecognize<wbr>.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -25,7 +25,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Performs Loop Idiom Recognize Pass.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LoopIdiomRecognizePass : public PassInfoMixin<LoopIdiomRecogni<wbr>zePass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // end namespace llvm<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopInstSimplify.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopInstSimplify.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopInstSimp<wbr>lify.h?rev=291651&r1=291650&<wbr>r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopInstSimplify.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopInstSimplify.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -23,7 +23,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Performs Loop Inst Simplify Pass.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LoopInstSimplifyPass : public PassInfoMixin<LoopInstSimplify<wbr>Pass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // end namespace llvm<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopRotation.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopRotation.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopRotation<wbr>.h?rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopRotation.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopRotation.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -24,7 +24,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LoopRotatePass : public PassInfoMixin<LoopRotatePass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopRotatePass(bool EnableHeaderDuplication = true);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
private:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
const bool EnableHeaderDuplication;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopSimplifyCFG.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopSimplifyCFG.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopSimplify<wbr>CFG.h?rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopSimplifyCFG.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopSimplifyCFG.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -26,7 +26,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Performs basic CFG simplifications to assist other loop passes.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LoopSimplifyCFGPass : public PassInfoMixin<LoopSimplifyCFGP<wbr>ass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // end namespace llvm<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopStrengthReduce<wbr>.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopStrengthReduce.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopStrength<wbr>Reduce.h?rev=291651&r1=291650&<wbr>r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopStrengthReduce<wbr>.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopStrengthReduce<wbr>.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -31,7 +31,8 @@ namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// Performs Loop Strength Reduce Pass.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class LoopStrengthReducePass : public PassInfoMixin<LoopStrengthRedu<wbr>cePass> {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // end namespace llvm<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopUnrollPass.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/Transforms/Scalar/LoopUnrollPass.h?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/include/llvm/<wbr>Transforms/Scalar/LoopUnrollPa<wbr>ss.h?rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopUnrollPass.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr>orms/Scalar/LoopUnrollPass.h Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -23,7 +23,8 @@ struct LoopUnrollPass : public PassInfoM<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Optional<bool> ProvidedRuntime;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Optional<bool> ProvidedUpperBound;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // end namespace llvm<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Analysis/IVUser<wbr>s.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/IVUsers.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Analysis/<wbr>IVUsers.cpp?rev=291651&r1=<wbr>291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/IVUser<wbr>s.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/IVUser<wbr>s.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -36,19 +36,15 @@ using namespace llvm;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
AnalysisKey IVUsersAnalysis::Key;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-IVUsers IVUsersAnalysis::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto &FAM =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- return IVUsers(&L, FAM.getCachedResult<Assumption<wbr>Analysis>(*F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- FAM.getCachedResult<LoopAnaly<wbr>sis>(*F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- FAM.getCachedResult<Dominator<wbr>TreeAnalysis>(*F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- FAM.getCachedResult<ScalarEvo<wbr>lutionAnalysis>(*F));<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+IVUsers IVUsersAnalysis::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return IVUsers(&L, &<a href="http://AR.AC" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.AC</a>, &<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>, &AR.DT, &<a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses IVUsersPrinterPass::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<IVUsersAnalysis>(<wbr>L).print(OS);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses IVUsersPrinterPass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &U) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<IVUsersAnalysis>(<wbr>L, AR).print(OS);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Analysis/LoopAc<wbr>cessAnalysis.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopAccessAnalysis.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Analysis/<wbr>LoopAccessAnalysis.cpp?rev=<wbr>291651&r1=291650&r2=291651&<wbr>view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopAc<wbr>cessAnalysis.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopAc<wbr>cessAnalysis.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -2120,31 +2120,16 @@ INITIALIZE_PASS_END(LoopAccess<wbr>LegacyAnal<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
AnalysisKey LoopAccessAnalysis::Key;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-LoopAccessInfo LoopAccessAnalysis::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const FunctionAnalysisManager &FAM =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function &F = *L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *SE = FAM.getCachedResult<ScalarEvol<wbr>utionAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *TLI = FAM.getCachedResult<TargetLibr<wbr>aryAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *AA = FAM.getCachedResult<AAManager><wbr>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!SE)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- report_fatal_error(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- "ScalarEvolution must have been cached at a higher level");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!AA)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- report_fatal_error("AliasAnaly<wbr>sis must have been cached at a higher level");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!DT)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- report_fatal_error("DominatorT<wbr>ree must have been cached at a higher level");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!LI)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- report_fatal_error("LoopInfo must have been cached at a higher level");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- return LoopAccessInfo(&L, SE, TLI, AA, DT, LI);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAccessInfo LoopAccessAnalysis::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return LoopAccessInfo(&L, &<a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>, &AR.TLI, &AR.AA, &AR.DT, &<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LoopAccessInfoPrinterPass::run<wbr>(Loop &L,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAccessInfoPrinterPass::ru<wbr>n(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Function &F = *L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &LAI = AM.getResult<LoopAccessAnalysi<wbr>s>(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ auto &LAI = AM.getResult<LoopAccessAnalysi<wbr>s>(L, AR);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
OS << "Loop access info in function '" << F.getName() << "':\n";<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
OS.indent(2) << L.getHeader()->getName() << ":\n";<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LAI.print(OS, 4);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Analysis/LoopIn<wbr>fo.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopInfo.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Analysis/<wbr>LoopInfo.cpp?rev=291651&r1=<wbr>291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopIn<wbr>fo.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopIn<wbr>fo.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -689,18 +689,13 @@ PreservedAnalyses LoopPrinterPass::run(F<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PrintLoopPass::PrintLoopPass(<wbr>) : OS(dbgs()) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PrintLoopPass::PrintLoopPass(<wbr>raw_ostream &OS, const std::string &Banner)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- : OS(OS), Banner(Banner) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses PrintLoopPass::run(Loop &L, AnalysisManager<Loop> &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+void llvm::printLoop(Loop &L, raw_ostream &OS, const std::string &Banner) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
OS << Banner;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
for (auto *Block : L.blocks())<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (Block)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Block->print(OS);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
else<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
OS << "Printing <null> block";<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
//===------------------------<wbr>------------------------------<wbr>----------------===//<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Analysis/LoopPa<wbr>ss.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPass.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Analysis/<wbr>LoopPass.cpp?rev=291651&r1=<wbr>291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopPa<wbr>ss.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopPa<wbr>ss.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -32,13 +32,14 @@ namespace {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// PrintLoopPass - Print a Function corresponding to a Loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
///<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
class PrintLoopPassWrapper : public LoopPass {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PrintLoopPass P;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ raw_ostream &OS;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ std::string Banner;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
static char ID;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PrintLoopPassWrapper() : LoopPass(ID) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PrintLoopPassWrapper() : LoopPass(ID), OS(dbgs()) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PrintLoopPassWrapper(raw_ostr<wbr>eam &OS, const std::string &Banner)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- : LoopPass(ID), P(OS, Banner) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ : LoopPass(ID), OS(OS), Banner(Banner) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
void getAnalysisUsage(AnalysisUsage &AU) const override {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
AU.setPreservesAll();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -49,8 +50,7 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
[](BasicBlock *BB) { return BB; });<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (BBI != L->blocks().end() &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
isFunctionInPrintList((*BBI)-<wbr>>getParent()->getName())) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LoopAnalysisManager DummyLAM;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- P.run(*L, DummyLAM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ printLoop(*L, OS, Banner);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return false;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Analysis/LoopPa<wbr>ssManager.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/LoopPassManager.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Analysis/<wbr>LoopPassManager.cpp?rev=<wbr>291651&r1=291650&r2=291651&<wbr>view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopPa<wbr>ssManager.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopPa<wbr>ssManager.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -20,34 +20,191 @@ using namespace llvm;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// Explicit template instantiations and specialization defininitions for core<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// template typedefs.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
namespace llvm {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-template class PassManager<Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-template class AnalysisManager<Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template class AllAnalysesOn<Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template class AnalysisManager<Loop, LoopStandardAnalysisResults &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template class PassManager<Loop, LoopAnalysisManager,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
template class InnerAnalysisManagerProxy<Loop<wbr>AnalysisManager, Function>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-template class OuterAnalysisManagerProxy<Func<wbr>tionAnalysisManager, Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template class OuterAnalysisManagerProxy<Func<wbr>tionAnalysisManager, Loop,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// Explicitly specialize the pass manager's run method to handle loop nest<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// structure updates.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
template <><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &>::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &U) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses PA = PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (DebugLogging)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ dbgs() << "Starting Loop pass manager run.\n";<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (auto &Pass : Passes) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (DebugLogging)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ dbgs() << "Running pass: " << Pass->name() << " on " << L;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses PassPA = Pass->run(L, AM, AR, U);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // If the loop was deleted, abort the run and return to the outer walk.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (U.skipCurrentLoop()) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.intersect(std::move(PassPA)<wbr>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ break;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Update the analysis manager as each pass runs and potentially<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // invalidates analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.invalidate(L, PassPA);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Finally, we intersect the final preserved analyses to compute the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // aggregate preserved set for this pass manager.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.intersect(std::move(PassPA)<wbr>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: Historically, the pass managers all called the LLVM context's<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // yield function here. We don't have a generic way to acquire the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // context and it isn't yet clear what the right pattern is for yielding<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // in the new pass manager so it is currently omitted.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // ...getContext().yield();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Invalidation for the current loop should be handled above, and other loop<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // analysis results shouldn't be impacted by runs over this loop. Therefore,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // the remaining analysis results in the AnalysisManager are preserved. We<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // mark this with a set so that we don't need to inspect each one<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // individually.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: This isn't correct! This loop and all nested loops' analyses should<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // be preserved, but unrolling should invalidate the parent loop's analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserveSet<AllAnalysesOn<L<wbr>oop>>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (DebugLogging)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ dbgs() << "Finished Loop pass manager run.\n";<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return PA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
bool LoopAnalysisManagerFunctionPro<wbr>xy::Result::invalidate(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Function &F, const PreservedAnalyses &PA,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
FunctionAnalysisManager::Inva<wbr>lidator &Inv) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // If this proxy isn't marked as preserved, the set of Function objects in<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // the module may have changed. We therefore can't call<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // InnerAM->invalidate(), because any pointers to Functions it has may be<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // stale.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // First compute the sequence of IR units covered by this proxy. We will want<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // to visit this in postorder, but because this is a tree structure we can do<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // this by building a preorder sequence and walking it in reverse.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ SmallVector<Loop *, 4> PreOrderLoops, PreOrderWorklist;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Note that we want to walk the roots in reverse order because we will end<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // up reversing the preorder sequence. However, it happens that the loop nest<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // roots are in reverse order within the LoopInfo object. So we just walk<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // forward here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: If we change the order of LoopInfo we will want to add a reverse<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (Loop *RootL : *LI) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ assert(PreOrderWorklist.empty(<wbr>) &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "Must start with an empty preorder walk worklist.");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderWorklist.push_back(Roo<wbr>tL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ do {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Loop *L = PreOrderWorklist.pop_back_val(<wbr>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderWorklist.append(L->beg<wbr>in(), L->end());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreOrderLoops.push_back(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ } while (!PreOrderWorklist.empty());<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // If this proxy or the loop info is going to be invalidated, we also need<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // to clear all the keys coming from that analysis. We also completely blow<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // away the loop analyses if any of the standard analyses provided by the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // loop pass manager go away so that loop analyses can freely use these<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // without worrying about declaring dependencies on them etc.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: It isn't clear if this is the right tradeoff. We could instead make<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // loop analyses declare any dependencies on these and use the more general<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // invalidation logic below to act on that.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
auto PAC = PA.getChecker<LoopAnalysisMana<wbr>gerFunctionProxy>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesO<wbr>n<Loop>>())<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- InnerAM->clear();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<wbr><Function>>()) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Inv.invalidate<AAManager>(F, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Inv.invalidate<AssumptionAnaly<wbr>sis>(F, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Inv.invalidate<DominatorTreeAn<wbr>alysis>(F, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Inv.invalidate<LoopAnalysis>(F<wbr>, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Inv.invalidate<ScalarEvolution<wbr>Analysis>(F, PA)) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Note that the LoopInfo may be stale at this point, however the loop<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // objects themselves remain the only viable keys that could be in the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // analysis manager's cache. So we just walk the keys and forcibly clear<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // those results. Note that the order doesn't matter here as this will just<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // directly destroy the results without calling methods on them.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (Loop *L : PreOrderLoops)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM->clear(*L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We also need to null out the inner AM so that when the object gets<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // destroyed as invalid we don't try to clear the inner AM again. At that<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // point we won't be able to reliably walk the loops for this function and<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // only clear results associated with those loops the way we do here.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: Making InnerAM null at this point isn't very nice. Most analyses<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // try to remain valid during invalidation. Maybe we should add an<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // `IsClean` flag?<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM = nullptr;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Now return true to indicate this *is* invalid and a fresh proxy result<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // needs to be built. This is especially important given the null InnerAM.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return true;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Directly check if the relevant set is preserved so we can short circuit<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // invalidating loops.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ bool AreLoopAnalysesPreserved =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.allAnalysesInSetPreserved<A<wbr>llAnalysesOn<Loop>>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Since we have a valid LoopInfo we can actually leave the cached results in<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // the analysis manager associated with the Loop keys, but we need to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // propagate any necessary invalidation logic into them. We'd like to<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // invalidate things in roughly the same order as they were put into the<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // cache and so we walk the preorder list in reverse to form a valid<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // postorder.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (Loop *L : reverse(PreOrderLoops)) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Optional<PreservedAnalyses> InnerPA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Check to see whether the preserved set needs to be adjusted based on<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // function-level analysis invalidation triggering deferred invalidation<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // for this loop.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (auto *OuterProxy =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM->getCachedResult<Funct<wbr>ionAnalysisManagerLoopProxy>(*<wbr>L))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (const auto &OuterInvalidationPair :<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ OuterProxy->getOuterInvalidat<wbr>ions()) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AnalysisKey *OuterAnalysisID = OuterInvalidationPair.first;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ const auto &InnerAnalysisIDs = OuterInvalidationPair.second;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (Inv.invalidate(OuterAnalysisI<wbr>D, F, PA)) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!InnerPA)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerPA = PA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ for (AnalysisKey *InnerAnalysisID : InnerAnalysisIDs)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerPA->abandon(InnerAnalysis<wbr>ID);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Check if we needed a custom PA set. If so we'll need to run the inner<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // invalidation.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (InnerPA) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM->invalidate(*L, *InnerPA);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ continue;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // FIXME: Proper suppor for invalidation isn't yet implemented for the LPM.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // Otherwise we only need to do invalidation if the original PA set didn't<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // preserve all Loop analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!AreLoopAnalysesPreserved)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ InnerAM->invalidate(*L, PA);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// Return false to indicate that this result is still a valid proxy.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return false;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template <><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr>oxy::Result<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr>oxy::run(Function &F,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ FunctionAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return Result(*InnerAM, AM.getResult<LoopAnalysis>(F))<wbr>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PreservedAnalyses llvm::getLoopPassPreservedAnal<wbr>yses() {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PreservedAnalyses PA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<AssumptionAnalysis<wbr>>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.preserve<DominatorTreeAnal<wbr>ysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.preserve<LoopAnalysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PA.preserve<LoopAnalysisManage<wbr>rFunctionProxy>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.preserve<ScalarEvolutionAn<wbr>alysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// TODO: What we really want to do here is preserve an AA category, but that<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// concept doesn't exist yet.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -57,3 +214,14 @@ PreservedAnalyses llvm::getLoopPassPrese<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
PA.preserve<SCEVAA>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PrintLoopPass::PrintLoopPass(<wbr>) : OS(dbgs()) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PrintLoopPass::PrintLoopPass(<wbr>raw_ostream &OS, const std::string &Banner)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ : OS(OS), Banner(Banner) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses PrintLoopPass::run(Loop &L, LoopAnalysisManager &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ printLoop(L, OS, Banner);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Passes/PassBuil<wbr>der.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Passes/PassBuilder.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Passes/Pa<wbr>ssBuilder.cpp?rev=291651&r1=29<wbr>1650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Passes/PassBuil<wbr>der.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Passes/PassBuil<wbr>der.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -38,6 +38,7 @@<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/LazyValueInfo.h<wbr>"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/LoopAccessAnaly<wbr>sis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/LoopInfo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/LoopPassManager<wbr>.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/MemoryDependenc<wbr>eAnalysis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/ModuleSummaryAn<wbr>alysis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#include "llvm/Analysis/OptimizationDia<wbr>gnosticInfo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -220,7 +221,8 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
/// \brief No-op loop pass which does nothing.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
struct NoOpLoopPass {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- PreservedAnalyses run(Loop &L, LoopAnalysisManager &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ PreservedAnalyses run(Loop &L, LoopAnalysisManager &,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &, LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
static StringRef name() { return "NoOpLoopPass"; }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -233,7 +235,9 @@ class NoOpLoopAnalysis : public Analysis<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
struct Result {};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Result run(Loop &, LoopAnalysisManager &) { return Result(); }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ Result run(Loop &, LoopAnalysisManager &, LoopStandardAnalysisResults &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return Result();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
static StringRef name() { return "NoOpLoopAnalysis"; }<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -1019,7 +1023,9 @@ bool PassBuilder::parseLoopPass(Loo<wbr>pPass<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
#define LOOP_ANALYSIS(NAME, CREATE_PASS) \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (Name == "require<" NAME ">") { \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LPM.addPass(RequireAnalysisPa<wbr>ss< \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- std::remove_reference<decltype<wbr>(CREATE_PASS)>::type, Loop>()); \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ std::remove_reference<decltype<wbr>(CREATE_PASS)>::type, Loop, \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopAnalysisManager, LoopStandardAnalysisResults &, \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &>()); \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return true; \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (Name == "invalidate<" NAME ">") { \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/IndVarSimplify.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/IndVarSimplify.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/IndVarSimplify.cpp?<wbr>rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/IndVarSimplify.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/IndVarSimplify.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -2482,23 +2482,13 @@ bool IndVarSimplify::run(Loop *L) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return Changed;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses IndVarSimplifyPass::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &FAM = AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses IndVarSimplifyPass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
const DataLayout &DL = F->getParent()->getDataLayout(<wbr>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *SE = FAM.getCachedResult<ScalarEvol<wbr>utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- assert((LI && SE && DT) &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- "Analyses required for indvarsimplify not available!");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // Optional analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *TTI = FAM.getCachedResult<TargetIRAn<wbr>alysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *TLI = FAM.getCachedResult<TargetLibr<wbr>aryAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- IndVarSimplify IVS(LI, SE, DT, DL, TLI, TTI);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ IndVarSimplify IVS(&<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>, &<a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>, &AR.DT, DL, &AR.TLI, &AR.TTI);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (!IVS.run(&L))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LICM.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LICM.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LICM.cpp?rev=291651&<wbr>r1=291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LICM.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LICM.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -185,23 +185,20 @@ private:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LICMPass::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LICMPass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR, LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
const auto &FAM =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L, AR).getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *AA = FAM.getCachedResult<AAManager><wbr>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *TLI = FAM.getCachedResult<TargetLibr<wbr>aryAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *SE = FAM.getCachedResult<ScalarEvol<wbr>utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
auto *ORE = FAM.getCachedResult<Optimizati<wbr>onRemarkEmitterAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- assert((AA && LI && DT && TLI && SE && ORE) &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- "Analyses for LICM not available");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // FIXME: This should probably be optional rather than required.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!ORE)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ report_fatal_error("LICM: OptimizationRemarkEmitterAnaly<wbr>sis not "<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ "cached at a higher level");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopInvariantCodeMotion LICM;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!LICM.runOnLoop(&L, AA, LI, DT, TLI, SE, ORE, true))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!LICM.runOnLoop(&L, &AR.AA, &<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>, &AR.DT, &AR.TLI, &<a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>, ORE, true))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
// FIXME: There is no setPreservesCFG in the new PM. When that becomes<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDeletion.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopDeletion.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LoopDeletion.cpp?rev=<wbr>291651&r1=291650&r2=291651&<wbr>view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDeletion.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDeletion.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -215,15 +215,10 @@ bool LoopDeletionPass::runImpl(Loop *L,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return Changed;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LoopDeletionPass::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &FAM = AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &DT = *FAM.getCachedResult<Dominator<wbr>TreeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &SE = *FAM.getCachedResult<ScalarEvo<wbr>lutionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &LI = *FAM.getCachedResult<LoopAnaly<wbr>sis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- bool Changed = runImpl(&L, DT, SE, LI);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LoopDeletionPass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ bool Changed = runImpl(&L, AR.DT, <a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>, <a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (!Changed)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDistribute.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopDistribute.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LoopDistribute.cpp?<wbr>rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDistribute.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopDistribute.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -946,10 +946,18 @@ PreservedAnalyses LoopDistributePass::ru<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
auto &SE = AM.getResult<ScalarEvolutionAn<wbr>alysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
auto &ORE = AM.getResult<OptimizationRemar<wbr>kEmitterAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // We don't directly need these analyses but they're required for loop<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ // analyses so provide them below.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ auto &AA = AM.getResult<AAManager>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ auto &AC = AM.getResult<AssumptionAnalysi<wbr>s>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ auto &TTI = AM.getResult<TargetIRAnalysis><wbr>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ auto &TLI = AM.getResult<TargetLibraryAnal<wbr>ysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
auto &LAM = AM.getResult<LoopAnalysisManag<wbr>erFunctionProxy>(F).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
std::function<const LoopAccessInfo &(Loop &)> GetLAA =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
[&](Loop &L) -> const LoopAccessInfo & {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- return LAM.getResult<LoopAccessAnalys<wbr>is>(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults AR = {AA, AC, DT, LI, SE, TLI, TTI};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ return LAM.getResult<LoopAccessAnalys<wbr>is>(L, AR);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
bool Changed = runImpl(F, &LI, &DT, &SE, &ORE, GetLAA);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopIdiomRecognize.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopIdiomRecognize.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LoopIdiomRecognize.<wbr>cpp?rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopIdiomRecognize.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopIdiomRecognize.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -186,24 +186,12 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
} // End anonymous namespace.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LoopIdiomRecognizePass::run(Lo<wbr>op &L,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto &FAM =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // Use getCachedResult because Loop pass cannot trigger a function analysis.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *AA = FAM.getCachedResult<AAManager><wbr>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *SE = FAM.getCachedResult<ScalarEvol<wbr>utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *TLI = FAM.getCachedResult<TargetLibr<wbr>aryAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto *TTI = FAM.getCachedResult<TargetIRAn<wbr>alysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LoopIdiomRecognizePass::run(Lo<wbr>op &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
const auto *DL = &L.getHeader()->getModule()->g<wbr>etDataLayout();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- assert((AA && DT && LI && SE && TLI && TTI && DL) &&<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- "Analyses for Loop Idiom Recognition not available");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LoopIdiomRecognize LIR(AA, DT, LI, SE, TLI, TTI, DL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopIdiomRecognize LIR(&AR.AA, &AR.DT, &<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>, &<a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>, &AR.TLI, &AR.TTI, DL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (!LIR.runOnLoop(&L))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopInstSimplify.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopInstSimplify.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LoopInstSimplify.cpp?<wbr>rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopInstSimplify.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopInstSimplify.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -183,20 +183,10 @@ public:<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
};<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LoopInstSimplifyPass::run(Loop &L,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto &FAM =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // Use getCachedResult because Loop pass cannot trigger a function analysis.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *AC = FAM.getCachedResult<Assumption<wbr>Analysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto *TLI = FAM.getCachedResult<TargetLibr<wbr>aryAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- assert((LI && AC && TLI) && "Analyses for Loop Inst Simplify not available");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!SimplifyLoopInst(&L, DT, LI, AC, TLI))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LoopInstSimplifyPass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!SimplifyLoopInst(&L, &AR.DT, &<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>, &<a href="http://AR.AC" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.AC</a>, &AR.TLI))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return getLoopPassPreservedAnalyses()<wbr>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopRotation.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopRotation.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LoopRotation.cpp?rev=<wbr>291651&r1=291650&r2=291651&<wbr>view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopRotation.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopRotation.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -625,20 +625,11 @@ bool LoopRotate::processLoop(Loop *L) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
LoopRotatePass::LoopRotatePas<wbr>s(bool EnableHeaderDuplication)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
: EnableHeaderDuplication(Enable<wbr>HeaderDuplication) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LoopRotatePass::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto &FAM = AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto *TTI = FAM.getCachedResult<TargetIRAn<wbr>alysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *AC = FAM.getCachedResult<Assumption<wbr>Analysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- assert((LI && TTI && AC) && "Analyses for loop rotation not available");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- // Optional analyses.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *SE = FAM.getCachedResult<ScalarEvol<wbr>utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LoopRotatePass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
int Threshold = EnableHeaderDuplication ? DefaultRotationThreshold : 0;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- LoopRotate LR(Threshold, LI, TTI, AC, DT, SE);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopRotate LR(Threshold, &<a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>, &AR.TTI, &<a href="http://AR.AC" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.AC</a>, &AR.DT, &<a href="http://AR.SE" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.SE</a>);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
bool Changed = LR.processLoop(&L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
if (!Changed)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopSimplifyCFG.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/LoopSimplifyCFG.cpp?rev=291651&r1=291650&r2=291651&view=diff" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">http://llvm.org/viewvc/llvm-pr<wbr>oject/llvm/trunk/lib/Transform<wbr>s/Scalar/LoopSimplifyCFG.cpp?<wbr>rev=291651&r1=291650&r2=<wbr>291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr>==============================<wbr>==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopSimplifyCFG.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr>ar/LoopSimplifyCFG.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -64,16 +64,10 @@ static bool simplifyLoopCFG(Loop &L, Dom<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return Changed;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- const auto &FAM =<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- AM.getResult<FunctionAnalysisM<wbr>anagerLoopProxy>(L).<wbr>getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- Function *F = L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *LI = FAM.getCachedResult<LoopAnalys<wbr>is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- auto *DT = FAM.getCachedResult<DominatorT<wbr>reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- assert((LI && DT) && "Analyses for LoopSimplifyCFG not available");<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
- if (!simplifyLoopCFG(L, *DT, *LI))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LoopStandardAnalysisResults &AR,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ LPMUpdater &) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+ if (!simplifyLoopCFG(L, AR.DT, <a href="http://AR.LI" rel="noreferrer" class="m_-7193326473438795034m_-8169182178038533986gmail_msg m_-7193326473438795034m_-8169182178038533986cremed" target="_blank">AR.LI</a>))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
return PreservedAnalyses::all();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
</blockquote></div></div></div><span class="HOEnZb"><font color="#888888"><span class="m_-7193326473438795034HOEnZb"><font color="#888888"><div dir="ltr">-- <br></div><div data-smartmail="gmail_signature"><div dir="ltr">Mike<br>Sent from phone</div></div>
</font></span></font></span></blockquote></div><br></div>
</blockquote></div><br></div>