<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="">
<div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">
Hi Peter,
<div class=""><br class="">
</div>
<div class="">We could probably tolerate a certain amount of unused jump table entries. However, I just realized that all non-inline imported calls end up going through a jump table entry. Is that correct? Initially I thought you meant calls promoted from indirect.
 While this can be fixed by replacing direct calls to jump tables with direct calls to real targets, I found other cases where ThinLTO+CFI has issues.</div>
<div class=""><br class="">
</div>
<div class="">In ThinLTO backend, type test lowering happens very early in the pipeline, before inlining. When the type check after the call to get_fptr() is lowered (in my original example, below), the compiler cannot see that both targets belong to the same
 type and that the type check will always return ‘true’ and can be eliminated. Moving the type check lowering pass further down the pipeline (after inlining) still does not solve the problem because CFI renaming happens early and symbols attached to the jump
 table do not have a matching type.</div>
<div class=""><br class="">
</div>
<div class="">I’m trying to think if there’s a way to delay renaming until ThinLTO backend type check lowering pass. It would help with solving both problems.</div>
<div class=""><br class="">
</div>
<div class="">Thanks.</div>
<div class="">Dmitry.</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
</div>
<div class="">
<blockquote type="cite" class="">
<div class="gmail_extra">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="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 class="" style="word-wrap: break-word; line-break: after-white-space;">
<div class="">
<div class="h5">
<div class="">
<div class="">
<blockquote type="cite" class="">
<div class="">
<div class="gmail_quote" style="font-family: CourierNewPSMT;">
<blockquote class="gmail_quote" style="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 class="" style="word-wrap: break-word; line-break: after-white-space;">
<div class="">
<div class="m_8743137098318580593h5">
<div class="">
<div class="">
<blockquote type="cite" class="">
<div class="">
<div class="gmail_quote">
<blockquote class="gmail_quote" style="margin: 0px 0px 0px 0.8ex; border-left-width: 1px; border-left-style: solid; border-left-color: rgb(204, 204, 204); padding-left: 1ex;">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> a.c<br class="">
> =============================<br class="">
> typedef int (*fptr_t) (void);<br class="">
> fptr_t get_fptr();<br class="">
> int main(int argc, char *argv[])<br class="">
> {<br class="">
>  fptr_t fp = get_fptr();<br class="">
>  return fp();<br class="">
> }<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> b.c<br class="">
> =============================<br class="">
> typedef int (*fptr_t) (void);<br class="">
> int foo(void) { return 11; }<br class="">
> int bar(void) { return 22; }<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> static fptr_t fptr = bar;<br class="">
> static int i = 53;<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> fptr_t get_fptr(void)<br class="">
> {<br class="">
>  if (i >= 0)<br class="">
>    fptr = foo;<br class="">
>  else<br class="">
>    fptr = bar;<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
>  return fptr;<br class="">
> }<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
<br class="">
</div>
<div class=""><br class="">
</div>
<div class=""><br class="">
<div><br class="">
<blockquote type="cite" class="">
<div class="">On Apr 19, 2018, at 6:18 PM, Peter Collingbourne <<a href="mailto:peter@pcc.me.uk" class="">peter@pcc.me.uk</a>> wrote:</div>
<br class="Apple-interchange-newline">
<div class="">
<div dir="ltr" class="">
<div class="">Regarding the orderfile, yes, I was thinking more about ordering the real functions.</div>
<div class=""><br class="">
</div>
<div class="">In that case it sounds like your best option may be to implement the optimization pass to make direct calls go directly to the real function. From a performance perspective I don't think it would make much difference if there are unused jump table
 entries.</div>
<div class=""><br class="">
</div>
<div class="">Peter</div>
</div>
<div class="gmail_extra"><br class="">
<div class="gmail_quote">On Thu, Apr 19, 2018 at 6:09 PM, via llvm-dev <span dir="ltr" class="">
<<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>></span> wrote:<br class="">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word;line-break:after-white-space" class="">Teresa, Peter,
<div class=""><br class="">
</div>
<div class="">Thanks for your help!</div>
<div class="">I need to re-run my experiments as the compiler I used did not have the latest changes like <span style="font-family:CourierNewPSMT" class="">r327254.</span></div>
<div class=""><font face="CourierNewPSMT" class="">The fact that the decision about routing calls through jump table entries is made early may be problematic. In my experiments with FreeBSD kernel, ThinLTO produced thousands jump table entries compared to only dozens
 with full LTO. As for re-ordering jump table entries, I don’t think it’s going to work as they are placed in the same section. Including *.cfi names into a link order file will take care of re-ordering real functions routed through jump table entries, but
 in our case we need to force some functions to be on the same page. So not having jump table entries for the functions that don't really need them would be ideal.</font></div>
<div class=""><font face="CourierNewPSMT" class=""><br class="">
</font></div>
<div class=""><font face="CourierNewPSMT" class="">Thanks.</font></div>
<div class=""><font face="CourierNewPSMT" class="">Dmitry.</font></div>
<div class="">
<div class="h5">
<div class=""><font face="CourierNewPSMT" class=""><br class="">
</font>
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On Apr 18, 2018, at 6:11 PM, Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank" class="">tejohnson@google.com</a>> wrote:</div>
<br class="m_8743137098318580593Apple-interchange-newline">
<div class=""><br class="m_8743137098318580593Apple-interchange-newline">
<br style="font-family:CourierNewPSMT;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;text-decoration:none" class="">
<div class="gmail_quote" style="font-family:CourierNewPSMT;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;text-decoration:none">
On Wed, Apr 18, 2018 at 4:49 PM,<span class="m_8743137098318580593Apple-converted-space"> </span><span class="m_8743137098318580593Apple-converted-space"> </span><span dir="ltr" class=""><<a href="mailto:dmitry.mikulin@sony.com" target="_blank" class="">dmitry.mikulin@sony.com</a>></span><span class="m_8743137098318580593Apple-converted-space"><wbr class=""> </span>wrote:<br class="">
<blockquote class="gmail_quote" style="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="word-wrap:break-word;line-break:after-white-space" class="">Hi Teresa,
<div class=""><br class="">
</div>
<div class="">Thanks for the info!</div>
<div class="">This example is my attempt to reduce FreeBSD kernel to something more manageable :)</div>
<div class=""><br class="">
</div>
<div class="">I will take a look at why globals are not being imported in this case. What’s the best tool to look into ThinLTO objects and their summaries? Most dumping tools don’t seem to like ThinLTO bitcode files…</div>
</div>
</blockquote>
<div class=""><br class="">
</div>
<div class="">Sadly there isn't a really great way to dump the summaries. =( There was a patch awhile back by a GSOC student to dump in YAML format, but there was resistance from some who preferred dumping to llvm assembly via llvm-dis and support reading in
 the summary from llvm assembly. It's been on my list of things to do, hasn't yet risen high enough in priority to work on that. For now, you have to use llvm-bcanalyzer -dump and look at the raw format.</div>
<div class=""><br class="">
</div>
<div class="">Teresa</div>
<div class=""><br class="">
</div>
<blockquote class="gmail_quote" style="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="word-wrap:break-word;line-break:after-white-space" class="">
<div class=""><br class="">
</div>
<div class="">Hopefully Peter can chime in regarding CFI related issues.</div>
<div class=""><br class="">
</div>
<div class="">Thanks.</div>
<div class="">Dmitry. </div>
<div class="">
<div class="m_8743137098318580593h5">
<div class=""><br class="">
<div class=""><br class="">
<blockquote type="cite" class="">
<div class="">On Apr 17, 2018, at 9:37 AM, Teresa Johnson <<a href="mailto:tejohnson@google.com" target="_blank" class="">tejohnson@google.com</a>> wrote:</div>
<br class="m_8743137098318580593m_5932420937475594305Apple-interchange-newline">
<div class="">
<div dir="ltr" class="">Hi Dmitry,
<div class=""><br class="">
</div>
<div class="">Sorry for the late reply. For CFI specific code generation, pcc is a better person to answer. But on the issue of global variables being optimized, that hasn't happened yet. That would be great if you wanted to pick that up!</div>
<div class=""><br class="">
</div>
<div class="">In your original email example, it seems like the file static i=53 could be constant propagated since there are no other defs, and the code in get_fptr simplified during the compile step, but I assume this is part of a more complex example where
 it is not possible to do this? Also note that with r327254 we started importing global variables. Do you know why we don't import in your case? I wonder if it has to do with it being CFI inserted code?</div>
<div class=""><br class="">
</div>
<div class="">Teresa</div>
</div>
<br class="">
<div class="gmail_quote">
<div dir="ltr" class="">On Tue, Apr 17, 2018 at 9:17 AM <<a href="mailto:dmitry.mikulin@sony.com" target="_blank" class="">dmitry.mikulin@sony.com</a>> wrote:<br class="">
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
I watched  Teresa’s talk on ThinLTO from last year’s CppCon, and it sounded like adding global variable information to the summaries was in the works, or at least in planning. Can someone (Teresa?) please share the current status? If it’s part of future plans,
 are there any specific proposals that can be picked up and worked on?<br class="">
<br class="">
Thanks!<br class="">
<br class="">
<br class="">
> On Apr 9, 2018, at 6:51 PM, via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a>> wrote:<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> Hi,<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> I’m working on setting up ThinLTO+CFI for a C application which uses a lot of function pointers. While functionally it appears stable, it’s performance is significantly degraded, to the tune of double digit percentage points compared to regular LTO+CFI.<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> Looking into possible causes I see that under ThinLTO+CFI iCall type checks almost always generate jump table entries for indirect calls, which creates another level of indirection for every such call. On top of that it breaks the link order layout because
 real function names point to jump table entries. It appears that I’m hitting a limitation in ThinLTO on how much information it can propagate across modules, particularly information about constants. In the example below, the fact that “i” is effectively a
 constant, is lost under ThinLTO, and the inlined copy of b.c:get_fptr() in a.c does not eliminate the conditional, which, for CFI purposes requires to generate a type check/jump table.<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> I was wondering if there was a way to mitigate this limitation.<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> a.c<br class="">
> =============================<br class="">
> typedef int (*fptr_t) (void);<br class="">
> fptr_t get_fptr();<br class="">
> int main(int argc, char *argv[])<br class="">
> {<br class="">
>  fptr_t fp = get_fptr();<br class="">
>  return fp();<br class="">
> }<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> b.c<br class="">
> =============================<br class="">
> typedef int (*fptr_t) (void);<br class="">
> int foo(void) { return 11; }<br class="">
> int bar(void) { return 22; }<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> static fptr_t fptr = bar;<br class="">
> static int i = 53;<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> fptr_t get_fptr(void)<br class="">
> {<br class="">
>  if (i >= 0)<br class="">
>    fptr = foo;<br class="">
>  else<br class="">
>    fptr = bar;<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
>  return fptr;<br class="">
> }<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
> ______________________________<wbr class="">_________________<br class="">
> LLVM Developers mailing list<br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><a href="mailto:llvm-dev@lists.llvm.org" target="_blank" class="">llvm-dev@lists.llvm.org</a><br class="">
><span class="m_8743137098318580593Apple-converted-space"> </span><a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-<wbr class="">bin/mailman/listinfo/llvm-dev</a><br class="">
<br class="">
</blockquote>
</div>
<br clear="all" class="">
<div class=""><br class="">
</div>
--<span class="m_8743137098318580593Apple-converted-space"> </span><br class="">
<div dir="ltr" class="m_8743137098318580593m_5932420937475594305m_-6854738011569243965gmail_signature" data-smartmail="gmail_signature">
<span style="font-family:Times;font-size:inherit" class="">
<table cellspacing="0" cellpadding="0" class="">
<tbody class="">
<tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small" class="">
<td style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px" class="">
Teresa Johnson |</td>
<td style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px" class="">
 Software Engineer |</td>
<td style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px" class="">
 <a href="mailto:tejohnson@google.com" target="_blank" class="">tejohnson@google.com</a> |</td>
<td style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px" class="">
 408-460-2413</td>
</tr>
</tbody>
</table>
</span></div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</div>
</blockquote>
</div>
<br style="font-family:CourierNewPSMT;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;text-decoration:none" class="">
<br clear="all" style="font-family:CourierNewPSMT;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;text-decoration:none" class="">
<div style="font-family:CourierNewPSMT;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;text-decoration:none" class="">
<br class="">
</div>
<span style="font-family:CourierNewPSMT;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;text-decoration:none;float:none;display:inline!important" class="">--<span class="m_8743137098318580593Apple-converted-space"> </span></span><br style="font-family:CourierNewPSMT;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;text-decoration:none" class="">
<div class="m_8743137098318580593gmail_signature" data-smartmail="gmail_signature" style="font-family:CourierNewPSMT;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;text-decoration:none">
<span style="font-family:Times;font-size:inherit" class="">
<table cellspacing="0" cellpadding="0" class="">
<tbody class="">
<tr style="color:rgb(85,85,85);font-family:sans-serif;font-size:small" class="">
<td nowrap="" style="border-top-style:solid;border-top-color:rgb(213,15,37);border-top-width:2px" class="">
Teresa Johnson |</td>
<td nowrap="" style="border-top-style:solid;border-top-color:rgb(51,105,232);border-top-width:2px" class="">
 Software Engineer |</td>
<td nowrap="" style="border-top-style:solid;border-top-color:rgb(0,153,57);border-top-width:2px" class="">
 <a href="mailto:tejohnson@google.com" target="_blank" class="">tejohnson@google.com</a> |</td>
<td nowrap="" style="border-top-style:solid;border-top-color:rgb(238,178,17);border-top-width:2px" class="">
 408-460-2413</td>
</tr>
</tbody>
</table>
</span></div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</div>
</div>
<br class="">
______________________________<wbr class="">_________________<br class="">
LLVM Developers mailing list<br class="">
<a href="mailto:llvm-dev@lists.llvm.org" class="">llvm-dev@lists.llvm.org</a><br class="">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" target="_blank" class="">http://lists.llvm.org/cgi-bin/<wbr class="">mailman/listinfo/llvm-dev</a><br class="">
<br class="">
</blockquote>
</div>
<br class="">
<br clear="all" class="">
<div class=""><br class="">
</div>
-- <br class="">
<div class="gmail_signature" data-smartmail="gmail_signature">
<div dir="ltr" class="">-- 
<div class="">Peter</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<br class="">
</div>
</div>
</body>
</html>