<div dir="ltr">On Fri, Apr 5, 2013 at 1:42 PM, Cameron McInally <span dir="ltr"><<a href="mailto:cameron.mcinally@nyu.edu" target="_blank">cameron.mcinally@nyu.edu</a>></span> wrote:<br><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-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">
<div>This is quite a conundrum to me. Yes, I agree with you on the C/C++ Standards interpretation. However, the x86-64 expectations are orthogonal. I find that other compilers, including GCC, will trap by default at high optimization levels on x86-64 for this test case. Hardly scientific, but every other compiler on our machines issues a trap.</div>
</div></div></div></blockquote><div><br></div><div style>The platform is irrelevant; division by zero is undefined, and compilers are allowed to optimize as if it can't happen. Both gcc and clang will lift the division out of this loop, for example, causing the hardware trap to happen in the "wrong" place if bar is passed zero:</div>
<div style><br></div><div>void foo(int x, int y);</div><div><br></div><div>void bar(int x) {</div><div><span class="" style="white-space:pre">      </span>for (int i = 0; i < 100; ++i) {</div><div><span class="" style="white-space:pre">         </span>foo(i, 200/x);</div>
<div><span class="" style="white-space:pre">    </span>}</div><div>}</div><div style><br></div><div style>If your program relies on the exact semantics of the 'idiv'/'udiv' hardware instruction, you might want to use an asm volatile statement.</div>
<div style><br></div><div style>-Joe </div></div></div></div>