<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">On Sep 27, 2018, at 10:36 AM, Finkel, Hal J. <<a href="mailto:hfinkel@anl.gov" class="">hfinkel@anl.gov</a>> wrote:<br class=""><div><blockquote type="cite" class="">On 09/27/2018 12:24 AM, Chris Lattner via llvm-dev wrote:<br class=""><div class=""><div text="#000000" bgcolor="#FFFFFF" class="">
<blockquote type="cite" cite="mid:6204A8B5-4F58-4825-B039-8DEF780DE016@nondot.org" class=""><div class=""><blockquote type="cite" class=""><div class="">On Sep 26, 2018, at 11:55 AM, Reid Kleckner <<a href="mailto:rnk@google.com" class="" moz-do-not-send="true">rnk@google.com</a>> wrote:</div>
<div class=""><blockquote class="gmail_quote" style="caret-color: rgb(0,
              0, 0); font-family: Helvetica; font-size: 12px;
              font-style: normal; font-variant-caps: normal;
              font-weight: normal; letter-spacing: normal; text-align:
              start; text-indent: 0px; text-transform: none;
              white-space: normal; word-spacing: 0px;
              -webkit-text-stroke-width: 0px; text-decoration: none;
              margin: 0px 0px 0px 0.8ex; border-left-width: 1px;
              border-left-style: solid; border-left-color: rgb(204, 204,
              204); padding-left: 1ex;"><div style="overflow-wrap: break-word;" class=""><div class=""><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><div class="gmail_quote"><div class="">As suggested in the bug, if we were to rewrite these passes to use MemorySSA, this bottleneck would go away. I rebased a patch to do that for DSE, but finishing it off and enabling it by default is probably out of scope for me.</div>
</div>
</div>
</div>
</blockquote>
<div class=""><br class="">
</div>
<div class="">Yes, understood, that would be a major change.  That said, changing the entire architecture of the compiler to work around this isn’t really appealing to me, I’d rather limit the problematic optimizations on the crazy large cases.</div>
</div>
</div>
</blockquote>
<div style="caret-color: rgb(0, 0, 0); font-family:
              Helvetica; font-size: 12px; font-style: normal;
              font-variant-caps: normal; font-weight: normal;
              letter-spacing: normal; text-align: start; text-indent:
              0px; text-transform: none; white-space: normal;
              word-spacing: 0px; -webkit-text-stroke-width: 0px;
              text-decoration: none;" class="">
<br class="">
</div>
<div style="caret-color: rgb(0, 0, 0); font-family:
              Helvetica; font-size: 12px; font-style: normal;
              font-variant-caps: normal; font-weight: normal;
              letter-spacing: normal; text-align: start; text-indent:
              0px; text-transform: none; white-space: normal;
              word-spacing: 0px; -webkit-text-stroke-width: 0px;
              text-decoration: none;" class="">
You're probably right, these passes probably aren't actually firing. But, it sounds like we have two options:</div>
<div style="caret-color: rgb(0, 0, 0); font-family:
              Helvetica; font-size: 12px; font-style: normal;
              font-variant-caps: normal; font-weight: normal;
              letter-spacing: normal; text-align: start; text-indent:
              0px; text-transform: none; white-space: normal;
              word-spacing: 0px; -webkit-text-stroke-width: 0px;
              text-decoration: none;" class="">
1. Add cutoffs to poorly understood slow passes that are misbehaving</div>
<div style="caret-color: rgb(0, 0, 0); font-family:
              Helvetica; font-size: 12px; font-style: normal;
              font-variant-caps: normal; font-weight: normal;
              letter-spacing: normal; text-align: start; text-indent:
              0px; text-transform: none; white-space: normal;
              word-spacing: 0px; -webkit-text-stroke-width: 0px;
              text-decoration: none;" class="">
2. Make a core data structure change to make dominance calculations faster and simpler for all transforms</div>
<div style="caret-color: rgb(0, 0, 0); font-family:
              Helvetica; font-size: 12px; font-style: normal;
              font-variant-caps: normal; font-weight: normal;
              letter-spacing: normal; text-align: start; text-indent:
              0px; text-transform: none; white-space: normal;
              word-spacing: 0px; -webkit-text-stroke-width: 0px;
              text-decoration: none;" class="">
<br class="">
</div>
<div style="caret-color: rgb(0, 0, 0); font-family:
              Helvetica; font-size: 12px; font-style: normal;
              font-variant-caps: normal; font-weight: normal;
              letter-spacing: normal; text-align: start; text-indent:
              0px; text-transform: none; white-space: normal;
              word-spacing: 0px; -webkit-text-stroke-width: 0px;
              text-decoration: none;" class="">
I can do this analysis, and add these cutoffs, but I wouldn't feel very good about it. It adds code complexity, we'll have to test it, and tomorrow someone will add new quadratic dominance queries. I don't see how heuristically limiting misbehaving optimizations
 builds a better foundation for LLVM tomorrow.</div>
</div>
</blockquote>
<div class=""><br class="">
</div>
<div class="">My answer to this is that the long term path is to move these passes to MemorySSA, which doesn’t have these problems.  At which point, the core IR change you are proposing becomes really the wrong thing.</div>
</div>
</blockquote>
<br class="">
<br class="">
Maybe I'm missing something, but why do you say this? MemorySSA certainly collects the memory references in a basic block into a set of use/def chains, but determining dominance still requires walking those chains. This might help reduce the constant factor
 on the O(N), because it skips the non-memory-access-instructions, but the underlying complexity problem remains. Maybe MemorySSA should cache a local numbering, but…</div></div></blockquote><div><br class=""></div><div>memcpyopt isn’t/shouldn’t be querying dominance of random instructions within a block, it is finding memcpy’s by scanning scalar def-use chains and trying to back patch relationships between them.  You’d use a fumdamentally different approach with MemorySSA, where  just walk the code, find memcpy’s, and ask what they depend on.</div><div><br class=""></div><div>This is all sparse, and doesn’t require dominance calls.  InstCombine doing conceptually similar things, and because it is based on use/def chains it doesn’t need to do any of this: the dominance relationship is implicit.</div><div><br class=""></div><blockquote type="cite" class=""><div class=""><div text="#000000" bgcolor="#FFFFFF" class="">

MemorySSA only helps if you're fine with skipping non-aliasing accesses. It's not clear to me that this is always the case. For example, imagine that we're trying to do something like SLP vectorization, and so we follow the use-def chain of an address calculation
 and find two adjacent, but non-aliasing, loads in the same basic block. </div></div></blockquote><div><br class=""></div><div>To be clear, I was only referring to the DSE/memcpyopt cases which appear to be the primary motivators for this line of work.  Specific transformations with specific needs can continued to use OrderedBB if beneficial.</div><div><br class=""></div><div><br class=""></div><blockquote type="cite" class=""><div text="#000000" bgcolor="#FFFFFF" class=""><blockquote type="cite" cite="mid:6204A8B5-4F58-4825-B039-8DEF780DE016@nondot.org" class="">
<div class="">1) Caching and invalidation are very difficult to get right.</div></blockquote></div></blockquote><blockquote type="cite" class=""><div text="#000000" bgcolor="#FFFFFF" class=""><blockquote type="cite" cite="mid:6204A8B5-4F58-4825-B039-8DEF780DE016@nondot.org" class=""><div class="">2) Invalidation logic slows down everyone even if they aren’t using the cache (your “check to see if I need to invalidate when permuting the ilist).</div>
<div class="">3) We try very hard not to put analysis/xform specific gunk into core IR types, because it punishes everyone but benefits only a few passes.</div>
</blockquote>
<br class="">
Dominance is a fundamental construct to an SSA-form IR. I certainly agree with you in general, but I'm not convinced by this reasoning in this case.<br class=""></div></blockquote><div><br class=""></div><div>I agree it is fundamental, but so is instruction ordering and a lot of other things that we already encode in one way in the IR.  This is proposing a redundant encoding of information, and we’re all just discussing the SW engineering tradeoffs of various approaches.</div><br class=""><blockquote type="cite" class=""><div text="#000000" bgcolor="#FFFFFF" class="">
<br class="">
<blockquote type="cite" cite="mid:6204A8B5-4F58-4825-B039-8DEF780DE016@nondot.org" class="">
<div class="">4) LLVM is used for a LOT of widely varying use cases - clang is just one client, and many of them don’t run these passes.  This change pessimizes all those clients, particularly the most sensitive 32-bit systems.</div>
</blockquote>
<br class="">
I don't see why this has anything to do with Clang. As I understood it, the self-host compile time of a large Clang source file was being used only as an example. This change may very well help many clients.<br class=""></div></blockquote><br class=""></div><div>Clang uses memcpyopt and DSE, but (e.g.) a graphics shader compiler would not.  Making the proposed change would pessimize memory use for that client and provide very little benefit.</div><div><br class=""></div><div>-Chris</div><div><br class=""></div><br class=""></body></html>