<div dir="ltr">I feel like there are two things being conflated here:<div><br></div><div>1) Does LLVM need new *LLVM* intrinsics to model this. The add-with-overflow intrinsics seem likely fine for as-is, don't require memory, but we don't lower the code to use adc for some reason. That seems like an LLVM bug that should be fixed in the x86 backend. If optimizing the LLVM intrinsics is hard, then maybe we need better ones, but that's likely about the (somewhat ridiculous) dance we have to do to "sum" the overflow flags rather than anything to do with memory.</div><div><br></div><div>2) Does Clang need new *C* builtins to avoid needing the carry-in / carry-out being in memory? I don't have a strong opinion about this. But the example in the original email gets optimized to have no unnecessary memory accesses already: <a href="https://godbolt.org/g/GFij97">https://godbolt.org/g/GFij97</a></div><div><br></div><div>#1 seems like the most interesting problem to solve. File a bug?</div></div><br><div class="gmail_quote"><div dir="ltr">On Wed, Feb 15, 2017 at 4:24 PM Brian Smith via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org">llvm-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Stephen Canon via llvm-dev <<a href="mailto:llvm-dev@lists.llvm.org" class="gmail_msg" target="_blank">llvm-dev@lists.llvm.org</a>> wrote:<br class="gmail_msg">
><br class="gmail_msg">
> Why do you think this requires new intrinsics instead of teaching the optimizer what to do with the existing intrinsics?<br class="gmail_msg">
<br class="gmail_msg">
IMO, as a multiprecision math library maker, the "teaching the<br class="gmail_msg">
optimizer what to do with the existing intrinsics" approach is much<br class="gmail_msg">
better as long as it can be made to work. If one is careful, MSVC does<br class="gmail_msg">
optimize its intrinsics into ADC instructions in a reasonable way, so<br class="gmail_msg">
I think it is probably doable.<br class="gmail_msg">
<br class="gmail_msg">
(Below, all math is multiprecision.)<br class="gmail_msg">
<br class="gmail_msg">
There are actually a few different operations besides pure addition<br class="gmail_msg">
and subtraction, e.g. `a - (b >> 1)` instead of just `a - b`. Also<br class="gmail_msg">
consider that we sometimes want "a - b" to be side-channel free and<br class="gmail_msg">
other times we'd rather "a - b" to be as fast as possible and<br class="gmail_msg">
optimized for the case where carries are unlikely to propagate (far).<br class="gmail_msg">
That's already three different operations, just for subtraction.<br class="gmail_msg">
<br class="gmail_msg">
Cheers,<br class="gmail_msg">
Brian<br class="gmail_msg">
--<br class="gmail_msg">
<a href="https://briansmith.org/" rel="noreferrer" class="gmail_msg" target="_blank">https://briansmith.org/</a><br class="gmail_msg">
_______________________________________________<br class="gmail_msg">
LLVM Developers mailing list<br class="gmail_msg">
<a href="mailto:llvm-dev@lists.llvm.org" class="gmail_msg" target="_blank">llvm-dev@lists.llvm.org</a><br class="gmail_msg">
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev" rel="noreferrer" class="gmail_msg" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev</a><br class="gmail_msg">
</blockquote></div>