<html><head><meta http-equiv="Content-Type" content="text/html charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hi Ivan<div class=""><br class=""></div><div class="">We frequently discuss which minimum version of GCC/MSVC LLVM should support building on.  The minimum GCC has often been driven from wanting to support building on Ubuntu LTS (currently I think this is 12.04).</div><div class=""><br class=""></div><div class="">Surely if 16.04 is needed for this fix, then this could impact users outside of the bots?  In that case, we should either raise the minimum to 16.04, or we need Chanler to fix the code?</div><div class=""><br class=""></div><div class="">Short term, the code needs to be fixed, as raising the minimum version is never a short conversation.</div><div class=""><br class=""></div><div class="">Thanks,</div><div class="">Pete</div><div class=""><div><blockquote type="cite" class=""><div class="">On Jan 11, 2017, at 3:54 PM, Ivan Krasin via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">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 class=""><div class="gmail_quote">On Wed, Jan 11, 2017 at 3:51 PM, Ivan Krasin <span dir="ltr" class=""><<a href="mailto:krasin@google.com" target="_blank" class="">krasin@google.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">Mike,<div class=""><br class=""></div><div class="">this is a known and fixed issue in libstdc++: <a href="https://gcc.gnu.org/bugzilla/show_bug.cgi?id=60734" target="_blank" class="">https://gcc.gnu.<wbr class="">org/bugzilla/show_bug.cgi?id=<wbr class="">60734</a></div><div class="">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 class="">This work is in the progress. ETA: end of day.</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On Wed, Jan 11, 2017 at 3:49 PM, Mike Aizatsky <span dir="ltr" class=""><<a href="mailto:aizatsky@google.com" target="_blank" class="">aizatsky@google.com</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr" class="">Chandler,<div class=""><br class=""></div><div class="">Looks like ubsan complains about this change:</div><div class=""><br class=""></div><div class=""><a href="http://lab.llvm.org:8011/builders/sanitizer-x86_64-linux-fast/builds/2034" target="_blank" class="">http://lab.llvm.org:8011/build<wbr class="">ers/sanitizer-x86_64-linux-<wbr class="">fast/builds/2034</a><br class=""></div><div class=""><br class=""></div><div class=""><div class="">[ RUN      ] LoopPassManagerTest.FunctionPa<wbr class="">ssInvalidationOfLoopAnalyses</div><div class="">/usr/lib/gcc/x86_64-linux-gnu/<wbr class="">4.9/../../../../include/c++/4.<wbr class="">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 class="">const void *const, testing::(anonymous namespace)::MockObjectState> >'</div><div class="">0x00000366a0d0: note: pointer points here</div><div class=""> 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 class="">              ^ </div><div class="">    #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 class="">os(std::_Rb_tree_const_iterato<wbr class="">r<std::pair<void const* const, testing::(anonymous namespace)::MockObjectState> >, void const* const&) /usr/lib/gcc/x86_64-linux-gnu/<wbr class="">4.9/../../../../include/c++/4.<wbr class="">9/bits/stl_tree.h:1540:28</div><div class="">    #1 0xc4ce76 in std::_Rb_tree_iterator<std::pa<wbr class="">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 class="">:piecewise_construct_t const&, std::tuple<void const* const&>, std::tuple<> >(std::_Rb_tree_const_iterator<wbr class=""><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 class="">4.9/../../../../include/c++/4.<wbr class="">9/bits/stl_tree.h:1794:19</div><div class="">    #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 class="">4.9/../../../../include/c++/4.<wbr class="">9/bits/stl_map.h:500:15</div><div class="">    #3 0xc4a2d8 in testing::Mock::Register(void const*, testing::internal::UntypedFunc<wbr class="">tionMockerBase*) /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googlemoc<wbr class="">k/src/<a href="http://gmock-spec-builders.cc" class="">gmock-spec-builders.cc</a>:<wbr class="">715:3</div><div class="">    #4 0xc4a27c in testing::internal::UntypedFunc<wbr class="">tionMockerBase::RegisterOwner(<wbr class="">void const*) /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googlemoc<wbr class="">k/src/<a href="http://gmock-spec-builders.cc" class="">gmock-spec-builders.cc</a>:<wbr class="">285:3</div><div class="">    #5 0x4efbc9 in (anonymous namespace)::MockLoopAnalysisHa<wbr class="">ndleTemplate<<wbr class="">18446744073709551615ul>::gmock<wbr class="">_run(testing::Matcher<llvm::<wbr class="">Loop&> const&, testing::Matcher<llvm::Analysi<wbr class="">sManager<llvm::Loop, llvm::LoopStandardAnalysisResu<wbr class="">lts&>&> const&, testing::Matcher<llvm::LoopSta<wbr class="">ndardAnalysisResults&> const&) /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/unittests/Analysis/LoopP<wbr class="">assManagerTest.cpp:120:3</div><div class="">    #6 0x4ed31b in (anonymous namespace)::MockAnalysisHandle<wbr class="">Base<(anonymous namespace)::MockLoopAnalysisHa<wbr class="">ndleTemplate<<wbr class="">18446744073709551615ul>, llvm::Loop, llvm::AnalysisManager<llvm::Lo<wbr class="">op, llvm::LoopStandardAnalysisResu<wbr class="">lts&>, llvm::LoopStandardAnalysisResu<wbr class="">lts&>::setDefaults() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/unittests/Analysis/LoopP<wbr class="">assManagerTest.cpp:82:5</div><div class="">    #7 0x4eb262 in (anonymous namespace)::LoopPassManagerTes<wbr class="">t::LoopPassManagerTest() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/unittests/Analysis/LoopP<wbr class="">assManagerTest.cpp:242:3</div><div class="">    #8 0x4f44ba in (anonymous namespace)::LoopPassManagerTes<wbr class="">t_FunctionPassInvalidationOfLo<wbr class="">opAnalyses_Test::LoopPassManag<wbr class="">erTest_FunctionPassInvalidatio<wbr class="">nOfLoopAnalyses_Test() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/unittests/Analysis/LoopP<wbr class="">assManagerTest.cpp:346:1</div><div class="">    #9 0x4f447f in testing::internal::TestFactory<wbr class="">Impl<(anonymous namespace)::LoopPassManagerTes<wbr class="">t_FunctionPassInvalidationOfLo<wbr class="">opAnalyses_Test>::CreateTest() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googletes<wbr class="">t/include/gtest/internal/<wbr class="">gtest-internal.h:484:43</div><div class="">    #10 0xc15510 in testing::TestInfo::Run() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googletes<wbr class="">t/src/<a href="http://gtest.cc:2647" class="">gtest.cc:2647</a>:22</div><div class="">    #11 0xc15c32 in testing::TestCase::Run() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googletes<wbr class="">t/src/<a href="http://gtest.cc:2774" class="">gtest.cc:2774</a>:28</div><div class="">    #12 0xc1c013 in testing::internal::UnitTestImp<wbr class="">l::RunAllTests() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googletes<wbr class="">t/src/<a href="http://gtest.cc:4649" class="">gtest.cc:4649</a>:43</div><div class="">    #13 0xc1bcab in testing::UnitTest::Run() /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/googletes<wbr class="">t/src/<a href="http://gtest.cc:4257" class="">gtest.cc:4257</a>:10</div><div class="">    #14 0xc0aef3 in main /mnt/b/sanitizer-buildbot3/san<wbr class="">itizer-x86_64-linux-fast/build<wbr class="">/llvm/utils/unittest/UnitTestM<wbr class="">ain/TestMain.cpp:51:10</div><div class="">    #15 0x7fe430cb6f44 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so<wbr class="">.6+0x21f44)</div><div class="">    #16 0x414903 in _start (/mnt/b/sanitizer-buildbot3/sa<wbr class="">nitizer-x86_64-linux-fast/buil<wbr class="">d/llvm_build_ubsan/unittests/<wbr class="">Analysis/AnalysisTests+<wbr class="">0x414903)</div><div class=""><br class=""></div><div class=""><br class=""></div><br class=""><div class="gmail_quote"><div dir="ltr" class="">On Tue, Jan 10, 2017 at 10:34 PM Chandler Carruth via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank" class="">llvm-commits@lists.llvm.org</a>> wrote:<br class=""></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 class="">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 class="">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 class="">is/IVUsers.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Analys<wbr class="">is/LoopAccessAnalysis.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Analys<wbr class="">is/LoopInfo.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Analys<wbr class="">is/LoopPassManager.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/IndVarSimplify.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LICM.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopDeletion.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopIdiomRecognize<wbr class="">.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopInstSimplify.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopRotation.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopSimplifyCFG.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopStrengthReduce<wbr class="">.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopUnrollPass.h<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Analysis/IVUser<wbr class="">s.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Analysis/LoopAc<wbr class="">cessAnalysis.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Analysis/LoopIn<wbr class="">fo.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Analysis/LoopPa<wbr class="">ss.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Analysis/LoopPa<wbr class="">ssManager.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Passes/PassBuil<wbr class="">der.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/IndVarSimplify.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LICM.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopDeletion.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopDistribute.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopIdiomRecognize.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopInstSimplify.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopRotation.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopSimplifyCFG.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopStrengthReduce.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopUnrollPass.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/lib/Transforms/Vect<wbr class="">orize/LoopVectorize.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/test/Other/loop-pas<wbr class="">s-ordering.ll<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/test/Other/new-pass<wbr class="">-manager.ll<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/test/Other/pass-pip<wbr class="">eline-parsing.ll<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
    llvm/trunk/unittests/Analysis/<wbr class="">LoopPassManagerTest.cpp<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Analys<wbr class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Analysis/IVUsers.h?rev=291651&<wbr class="">r1=291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr class="">is/IVUsers.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Analysis/LoopAccessAnalysis.h?<wbr class="">rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr class="">is/LoopAccessAnalysis.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr class="">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 class="">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 class="">:getSource(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Analys<wbr class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Analysis/LoopInfo.h?rev=291651<wbr class="">&r1=291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr class="">is/LoopInfo.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Analysis/LoopPassManager.h?<wbr class="">rev=291651&r1=291650&r2=291651<wbr class="">&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Analys<wbr class="">is/LoopPassManager.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Analys<wbr class="">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 class="">------------------------------<wbr class="">----------------===//<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 class="">------------------------------<wbr class="">----------------===//<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #ifndef LLVM_ANALYSIS_LOOPPASSMANAGER_<wbr class="">H<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #define LLVM_ANALYSIS_LOOPPASSMANAGER_<wbr class="">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 class="">"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/BasicAliasAnaly<wbr class="">sis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/GlobalsModRef.h<wbr class="">"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/LoopInfo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/ScalarEvolution<wbr class="">.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/ScalarEvolution<wbr class="">AliasAnalysis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/TargetLibraryIn<wbr class="">fo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/TargetTransform<wbr class="">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 class="">AnalysisManager, Function><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
     LoopAnalysisManagerFunctionPr<wbr class="">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 class="">xy's result.<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+/// A specialized result for the \c LoopAnalysisManagerFunctionPro<wbr class="">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 class="">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 class="">), 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 class="">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 class="">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 class="">xy::Result::invalidate(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-    Function &F, const PreservedAnalyses &PA,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-    FunctionAnalysisManager::Inval<wbr class="">idator &Inv);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr class="">oxy::Result<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr class="">oxy::run(Function &F, FunctionAnalysisManager &AM);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 // Ensure the \c LoopAnalysisManagerFunctionPro<wbr class="">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 class="">AnalysisManager, Function>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-extern template class OuterAnalysisManagerProxy<Func<wbr class="">tionAnalysisManager, Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+extern template class OuterAnalysisManagerProxy<Func<wbr class="">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 class="">tionAnalysisManager, Loop><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+typedef OuterAnalysisManagerProxy<Func<wbr class="">tionAnalysisManager, Loop,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                                  LoopStandardAnalysisResults &><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
     FunctionAnalysisManagerLoopPr<wbr class="">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 class="">;<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 class="">) &&<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 class="">tL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+    do {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Loop *L = PreOrderWorklist.pop_back_val(<wbr class="">);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      PreOrderWorklist.append(L->beg<wbr class="">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 class="">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 class="">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 class="">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 class="">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 class="">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 class="">F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-    (void)AM.getResult<DominatorTr<wbr class="">eeAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-    (void)AM.getResult<ScalarEvolu<wbr class="">tionAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-    (void)AM.getResult<TargetLibra<wbr class="">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 class="">is>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                                       AM.getResult<DominatorTreeAna<wbr class="">lysis>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                                       AM.getResult<LoopAnalysis>(F)<wbr class="">,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                                       AM.getResult<ScalarEvolutionA<wbr class="">nalysis>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                                       AM.getResult<TargetLibraryAna<wbr class="">lysis>(F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                                       AM.getResult<TargetIRAnalysis<wbr class="">>(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 class="">, 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 class="">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 class="">));<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 class="">Loop>>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
     PA.preserve<LoopAnalysisManag<wbr class="">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 class="">>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+    PA.preserve<DominatorTreeAnaly<wbr class="">sis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+    PA.preserve<LoopAnalysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+    PA.preserve<ScalarEvolutionAna<wbr class="">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 class="">PassT><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 createFunctionToLoopPassAdapt<wbr class="">or(LoopPassT Pass) {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   return FunctionToLoopPassAdaptor<Loop<wbr class="">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 class="">H<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/include/llvm/Transf<wbr class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/IndVarSimpli<wbr class="">fy.h?rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/IndVarSimplify.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LICM.h?rev=<wbr class="">291651&r1=291650&r2=291651&<wbr class="">view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LICM.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopDeletion<wbr class="">.h?rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopDeletion.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">> {<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 class="">orms/Scalar/LoopIdiomRecognize<wbr class="">.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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopIdiomRec<wbr class="">ognize.h?rev=291651&r1=291650&<wbr class="">r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopIdiomRecognize<wbr class="">.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopIdiomRecognize<wbr class="">.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 class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopInstSimp<wbr class="">lify.h?rev=291651&r1=291650&<wbr class="">r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopInstSimplify.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopRotation<wbr class="">.h?rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopRotation.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopSimplify<wbr class="">CFG.h?rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopSimplifyCFG.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">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 class="">orms/Scalar/LoopStrengthReduce<wbr class="">.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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopStrength<wbr class="">Reduce.h?rev=291651&r1=291650&<wbr class="">r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopStrengthReduce<wbr class="">.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopStrengthReduce<wbr class="">.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 class="">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 class="">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 class="">oject/llvm/trunk/include/llvm/<wbr class="">Transforms/Scalar/LoopUnrollPa<wbr class="">ss.h?rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/include/llvm/Transf<wbr class="">orms/Scalar/LoopUnrollPass.h (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/include/llvm/Transf<wbr class="">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 class="">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 class="">oject/llvm/trunk/lib/Analysis/<wbr class="">IVUsers.cpp?rev=291651&r1=<wbr class="">291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/IVUser<wbr class="">s.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/IVUser<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">Analysis>(*F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-                 FAM.getCachedResult<LoopAnaly<wbr class="">sis>(*F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-                 FAM.getCachedResult<Dominator<wbr class="">TreeAnalysis>(*F),<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-                 FAM.getCachedResult<ScalarEvo<wbr class="">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 class="">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 class="">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 class="">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 class="">oject/llvm/trunk/lib/Analysis/<wbr class="">LoopAccessAnalysis.cpp?rev=<wbr class="">291651&r1=291650&r2=291651&<wbr class="">view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopAc<wbr class="">cessAnalysis.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopAc<wbr class="">cessAnalysis.cpp Wed Jan 11 00:23:21 2017<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
@@ -2120,31 +2120,16 @@ INITIALIZE_PASS_END(LoopAccess<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  Function &F = *L.getHeader()->getParent();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *SE = FAM.getCachedResult<ScalarEvol<wbr class="">utionAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *TLI = FAM.getCachedResult<TargetLibr<wbr class="">aryAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *AA = FAM.getCachedResult<AAManager><wbr class="">(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *DT = FAM.getCachedResult<DominatorT<wbr class="">reeAnalysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *LI = FAM.getCachedResult<LoopAnalys<wbr class="">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 class="">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 class="">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 class="">(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 class="">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 class="">s>(L);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+  auto &LAI = AM.getResult<LoopAccessAnalysi<wbr class="">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 class="">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 class="">oject/llvm/trunk/lib/Analysis/<wbr class="">LoopInfo.cpp?rev=291651&r1=<wbr class="">291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopIn<wbr class="">fo.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopIn<wbr class="">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 class="">) : OS(dbgs()) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-PrintLoopPass::PrintLoopPass(<wbr class="">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 class="">------------------------------<wbr class="">----------------===//<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Analysis/LoopPa<wbr class="">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 class="">oject/llvm/trunk/lib/Analysis/<wbr class="">LoopPass.cpp?rev=291651&r1=<wbr class="">291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopPa<wbr class="">ss.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopPa<wbr class="">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 class="">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 class="">>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 class="">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 class="">oject/llvm/trunk/lib/Analysis/<wbr class="">LoopPassManager.cpp?rev=<wbr class="">291651&r1=291650&r2=291651&<wbr class="">view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Analysis/LoopPa<wbr class="">ssManager.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Analysis/LoopPa<wbr class="">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 class="">AnalysisManager, Function>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-template class OuterAnalysisManagerProxy<Func<wbr class="">tionAnalysisManager, Loop>;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+template class OuterAnalysisManagerProxy<Func<wbr class="">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 class="">);<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 class="">);<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 class="">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 class="">xy::Result::invalidate(<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
     Function &F, const PreservedAnalyses &PA,<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
     FunctionAnalysisManager::Inva<wbr class="">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 class="">) &&<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 class="">tL);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+    do {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Loop *L = PreOrderWorklist.pop_back_val(<wbr class="">);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      PreOrderWorklist.append(L->beg<wbr class="">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 class="">gerFunctionProxy>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  if (!PAC.preserved() && !PAC.preservedSet<AllAnalysesO<wbr class="">n<Loop>>())<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-    InnerAM->clear();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+  if (!(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<wbr class=""><Function>>()) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Inv.invalidate<AAManager>(F, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Inv.invalidate<AssumptionAnaly<wbr class="">sis>(F, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Inv.invalidate<DominatorTreeAn<wbr class="">alysis>(F, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Inv.invalidate<LoopAnalysis>(F<wbr class="">, PA) ||<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      Inv.invalidate<ScalarEvolution<wbr class="">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 class="">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 class="">ionAnalysisManagerLoopProxy>(*<wbr class="">L))<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      for (const auto &OuterInvalidationPair :<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+           OuterProxy->getOuterInvalidat<wbr class="">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 class="">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 class="">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 class="">oxy::Result<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+LoopAnalysisManagerFunctionPr<wbr class="">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 class="">;<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 class="">yses() {<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   PreservedAnalyses PA;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+  PA.preserve<AssumptionAnalysis<wbr class="">>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   PA.preserve<DominatorTreeAnal<wbr class="">ysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   PA.preserve<LoopAnalysis>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+  PA.preserve<LoopAnalysisManage<wbr class="">rFunctionProxy>();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   PA.preserve<ScalarEvolutionAn<wbr class="">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 class="">) : OS(dbgs()) {}<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PrintLoopPass::PrintLoopPass(<wbr class="">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 class="">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 class="">oject/llvm/trunk/lib/Passes/Pa<wbr class="">ssBuilder.cpp?rev=291651&r1=29<wbr class="">1650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Passes/PassBuil<wbr class="">der.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Passes/PassBuil<wbr class="">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 class="">"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/LoopAccessAnaly<wbr class="">sis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/LoopInfo.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+#include "llvm/Analysis/LoopPassManager<wbr class="">.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/MemoryDependenc<wbr class="">eAnalysis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/ModuleSummaryAn<wbr class="">alysis.h"<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
 #include "llvm/Analysis/OptimizationDia<wbr class="">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 class="">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 class="">ss<                                           \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-                std::remove_reference<decltype<wbr class="">(CREATE_PASS)>::type, Loop>());  \<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+                std::remove_reference<decltype<wbr class="">(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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/IndVarSimplify.cpp?<wbr class="">rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/IndVarSimplify.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *LI = FAM.getCachedResult<LoopAnalys<wbr class="">is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *SE = FAM.getCachedResult<ScalarEvol<wbr class="">utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *DT = FAM.getCachedResult<DominatorT<wbr class="">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 class="">alysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *TLI = FAM.getCachedResult<TargetLibr<wbr class="">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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LICM.cpp?rev=291651&<wbr class="">r1=291650&r2=291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LICM.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">getManager();<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+      AM.getResult<FunctionAnalysisM<wbr class="">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 class="">(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *LI = FAM.getCachedResult<LoopAnalys<wbr class="">is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *DT = FAM.getCachedResult<DominatorT<wbr class="">reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *TLI = FAM.getCachedResult<TargetLibr<wbr class="">aryAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *SE = FAM.getCachedResult<ScalarEvol<wbr class="">utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   auto *ORE = FAM.getCachedResult<Optimizati<wbr class="">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 class="">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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LoopDeletion.cpp?rev=<wbr class="">291651&r1=291650&r2=291651&<wbr class="">view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopDeletion.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">TreeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto &SE = *FAM.getCachedResult<ScalarEvo<wbr class="">lutionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto &LI = *FAM.getCachedResult<LoopAnaly<wbr class="">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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LoopDistribute.cpp?<wbr class="">rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopDistribute.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">alysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   auto &ORE = AM.getResult<OptimizationRemar<wbr class="">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 class="">s>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+  auto &TTI = AM.getResult<TargetIRAnalysis><wbr class="">(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+  auto &TLI = AM.getResult<TargetLibraryAnal<wbr class="">ysis>(F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
   auto &LAM = AM.getResult<LoopAnalysisManag<wbr class="">erFunctionProxy>(F).<wbr class="">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 class="">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 class="">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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LoopIdiomRecognize.<wbr class="">cpp?rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopIdiomRecognize.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *DT = FAM.getCachedResult<DominatorT<wbr class="">reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *LI = FAM.getCachedResult<LoopAnalys<wbr class="">is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *SE = FAM.getCachedResult<ScalarEvol<wbr class="">utionAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *TLI = FAM.getCachedResult<TargetLibr<wbr class="">aryAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  const auto *TTI = FAM.getCachedResult<TargetIRAn<wbr class="">alysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+PreservedAnalyses LoopIdiomRecognizePass::run(Lo<wbr class="">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 class="">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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LoopInstSimplify.cpp?<wbr class="">rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopInstSimplify.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *LI = FAM.getCachedResult<LoopAnalys<wbr class="">is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *AC = FAM.getCachedResult<Assumption<wbr class="">Analysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  const auto *TLI = FAM.getCachedResult<TargetLibr<wbr class="">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 class="">;<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
Modified: llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LoopRotation.cpp?rev=<wbr class="">291651&r1=291650&r2=291651&<wbr class="">view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopRotation.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">s(bool EnableHeaderDuplication)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
     : EnableHeaderDuplication(Enable<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  const auto *TTI = FAM.getCachedResult<TargetIRAn<wbr class="">alysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *AC = FAM.getCachedResult<Assumption<wbr class="">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 class="">reeAnalysis>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *SE = FAM.getCachedResult<ScalarEvol<wbr class="">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 class="">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 class="">oject/llvm/trunk/lib/Transform<wbr class="">s/Scalar/LoopSimplifyCFG.cpp?<wbr class="">rev=291651&r1=291650&r2=<wbr class="">291651&view=diff</a><br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
==============================<wbr class="">==============================<wbr class="">==================<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
--- llvm/trunk/lib/Transforms/Scal<wbr class="">ar/LoopSimplifyCFG.cpp (original)<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
+++ llvm/trunk/lib/Transforms/Scal<wbr class="">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 class="">anagerLoopProxy>(L).<wbr class="">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 class="">is>(*F);<br class="m_-7193326473438795034m_-8169182178038533986gmail_msg">
-  auto *DT = FAM.getCachedResult<DominatorT<wbr class="">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" class=""><span class="m_-7193326473438795034HOEnZb"><font color="#888888" class=""><div dir="ltr" class="">-- <br class=""></div><div data-smartmail="gmail_signature" class=""><div dir="ltr" class="">Mike<br class="">Sent from phone</div></div>
</font></span></font></span></blockquote></div><br class=""></div>
</blockquote></div><br class=""></div>
_______________________________________________<br class="">llvm-commits mailing list<br class=""><a href="mailto:llvm-commits@lists.llvm.org" class="">llvm-commits@lists.llvm.org</a><br class="">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits<br class=""></div></blockquote></div><br class=""></div></body></html>