<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 3, 2015 at 5:09 PM, Philip Reames <span dir="ltr"><<a href="mailto:listmail@philipreames.com" target="_blank">listmail@philipreames.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div text="#000000" bgcolor="#FFFFFF">
The common use case I've seen for a black box like construct is when
writing microbenchmarks. In particular, you're generally looking
for a way to "sink" the result of a computation without having that
sink outweigh the cost of the thing you're trying to measure.<br>
<br>
Common alternate approaches are to use a volatile store (so that it
can't be eliminated or sunk out of loops) or a call to an external
function with a cheap calling convention. <br>
<br>
As an example:<br>
int a = 5; // initialization is not visible to compiler<br></div></blockquote><div><br></div><div>This intrinsic is designed to provide exactly this (assuming `__builtin_blackbox` is also added to clang):</div><div><br></div><div>int a = __builtin_blackbox(5);</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
int b = 7;<br>
void add_two_globals()<br>
sink(a+b)<br></div></blockquote><div><br></div><div>And:</div><div><br></div><div>__builtin_blackbox(a+b);</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">
}<br>
<br>
If what I'm look into is the code generation around addition, this
is a very useful way of testing the entire compiler - frontend,
middle end, and backend. <br>
<br>
I'll note that we use such a framework extensively. <br>
<br>
What I'm not clear on is why this needs to be an intrinsic. Why
does a call to an external function or a volatile store not
suffice? <span><font color="#888888"><br></font></span></div></blockquote><div><br></div><div>Because Rust's `test::black_box` is generic, it can't be an external function. Also, code using this will actually be executed, so it's also not good enough to leave it undefined.</div></div></div></div>