<div dir="ltr"><div dir="ltr">On Sun, 25 Aug 2019 at 18:35, Arthur O'Dwyer <<a href="mailto:arthur.j.odwyer@gmail.com">arthur.j.odwyer@gmail.com</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>(Did you drop the list intentionally?)</div></div></div></div></div></div></div></blockquote><div><br></div><div>Oops. Thanks. </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, Aug 25, 2019 at 11:43 AM John McFarlane <<a href="mailto:john@mcfarlane.name" target="_blank">john@mcfarlane.name</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><br></div><div class="gmail_quote"><div>It's been mentioned before that the decision to inline here is comparable to a conditional `__forceinline` or `always_inline` directive where the predicate it is what is under question.</div><div><br></div><div>My formula:</div><div><br></div><div>    __forceinline(included_via_isystem(callee)) auto find_if(....) { .... }</div><div><br></div><div>Your formula (perhaps?):</div><div><br></div><div>    __forceinline(included_via_isystem(callee)&&included_via_isystem(caller)) auto find_if(....) { .... }</div></div></div></blockquote><div><br></div><div>Yes, that's essentially it.</div><div>However, I repeat that the primitive operation with inlining is "collapsing an <i><b>edge</b></i> of the call graph." We do not inline a <i><b>function definition</b></i>; we inline a specific <i><b>call</b></i> (from caller to callee).  So I would say that the compiler's algorithm for inlining currently looks like</div><div><br></div><div>    bool ShouldInline(Func caller, Func callee) { // and we might add "SourceLocation callsite", which is unused here</div><div>        bool heuristic = (callee.is_small() || callee.has_forceinline_attribute());<br></div><div>        return heuristic && (-O2 or greater);</div><div>    }<br></div><div><br></div><div>and that we want it to instead look like</div><div><br></div><div><div>    bool ShouldInline(Func caller, Func callee) {</div><div>        bool heuristic = (callee.is_small() || callee.has_forceinline_attribute());<br></div><div>        bool is_system_to_system = (callee.is_from_system_header() && caller.is_from_system_header());</div><div>        return heuristic && (</div><div>            (-O2 or greater) || (-Og && is_system_to_system)</div><div>        );</div><div>    }<br></div></div><div><br></div><div>I would stay away from trying to frame the solution as "adding attributes to certain function definitions," because the intended behavior is not a property of function definitions (<i><b>nodes</b></i> in the call graph) — it's a property of <i><b>calls</b></i> (<i><b>edges</b></i> in the call graph). Namely, the property is, do we want to inline that call or not.</div></div></div></div></div></div></div></div></blockquote><div><br></div><div>The attribute in question is conditional otherwise wouldn't forceinline be all we need? So kind of like `noexcept(predicate)` but dependent on caller/callee -- rather than `T`. So I think the above predicate is a helpful thought experiment.</div><div><br></div><div>Again, for all the arguments I gave previously, I think that `find_if` and `operator==` in our example should be inlined. Your `is_system_to_system` test would fail for those. </div><div><br></div><div>John</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><div><br></div><div>–Arthur</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
</blockquote></div></div>
</blockquote></div></div></div>
</blockquote></div></div>
</blockquote></div></div>
</blockquote></div></div></div></div></div></div></div>
</blockquote></div></div>