<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 23 November 2013 14:14, Hal Finkel <span dir="ltr"><<a href="mailto:hfinkel@anl.gov" target="_blank">hfinkel@anl.gov</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
On some systems (Linux/glibc, for example), some libm math functions (like cos(double)) might set errno. It is important that we model this, in general, to prevent miscompilation (we would not, for example, want to reorder a call to cos in between a call to open and a call to perror). However, almost no code in the wild checks errno after calls to libm math functions, and this errno-setting behavior prevents vectorization and other useful loop optimizations, CSE, etc. Also, currently, the scalar llvm.<libm function> intrinsics are subtly broken on systems where the underlying libm functions may set errno, because the intrinsics are readonly, and may be implemented by calls to the libm function (which might set errno), exposing us to reordering problems (as in the example above).<br>
</blockquote><div><br></div><div>Hi Hal,</div><div><br></div><div>I'm confused. On one hand you're proposing us to stop reordering libm calls because they might set errno (I agree with this), but on the other hand you're saying that nobody cares and that prevents optimizations (not sure I agree with this).</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"> 1. Assume that all unknown external functions might read/write errno </blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

 2. Assume that all i32 pointers might point to errno (although we might be able to do better by somehow leveraging TBAA for "int"?)<br></blockquote><div><br></div><div>Something like "MayBeErr", "IsErr", "IsntErr".</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Does anyone see any problems with making stronger (type-based) assumptions re: errno (and, thus, on what things may alias with calls to errno-setting-libm functions)?</blockquote>
<div><br></div><div>I don't, but I'm trying to think of a way to disable it if we know it's "ok". Maybe -unsafe-math or something similar could disable this pass, because it is expensive and will impact generated code.</div>
<div><br></div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">What if, for globals, we insisted that the global be named "errno"?<br></blockquote>
<div></div></div><br></div><div class="gmail_extra">I wouldn't be surprised if there was a system where the golbal error is not errno. Windows maybe?</div><div class="gmail_extra"><br></div><div class="gmail_extra">--renato</div>
</div>