OK. Should we more explicitly set "hasSideEffects = 1" then so that its not subtly happening due to lack of a pattern?<br><br><div class="gmail_quote">On Wed, Jan 2, 2013 at 11:11 AM, Jakob Stoklund Olesen <span dir="ltr"><<a href="mailto:stoklund@2pi.dk" target="_blank">stoklund@2pi.dk</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="im"><br>
On Jan 2, 2013, at 11:04 AM, Jakob Stoklund Olesen <<a href="mailto:stoklund@2pi.dk">stoklund@2pi.dk</a>> wrote:<br>
<br>
><br>
> On Dec 26, 2012, at 7:01 PM, Craig Topper <<a href="mailto:craig.topper@gmail.com">craig.topper@gmail.com</a>> wrote:<br>
><br>
>> Author: ctopper<br>
>> Date: Wed Dec 26 21:01:18 2012<br>
>> New Revision: 171136<br>
>><br>
>> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=171136&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=171136&view=rev</a><br>
>> Log:<br>
>> Mark the divide instructions as hasSideEffects=0.<br>
><br>
> Hi Craig,<br>
><br>
> I don't think this is safe because div instructions can trap when the divisor is 0, and that means it is not safe to move them between basic blocks. See also llvm::isSafeToSpeculativelyExecute().<br>
<br>
</div>For example:<br>
<br>
$ cat unsafe-div.c<br>
int f(int a, int b) {<br>
  return b ? a/b : a;<br>
}<br>
<br>
$ Release+Asserts/bin/clang -O -o- -S unsafe-div.c -mllvm -x86-early-ifcvt -mllvm -stress-early-ifcvt<br>
        .section        __TEXT,__text,regular,pure_instructions<br>
        .globl  _f<br>
        .align  4, 0x90<br>
_f:                                     ## @f<br>
        .cfi_startproc<br>
## BB#0:                                ## %entry<br>
        pushq   %rbp<br>
Ltmp2:<br>
        .cfi_def_cfa_offset 16<br>
Ltmp3:<br>
        .cfi_offset %rbp, -16<br>
        movq    %rsp, %rbp<br>
Ltmp4:<br>
        .cfi_def_cfa_register %rbp<br>
        movl    %edi, %eax<br>
        cltd<br>
        idivl   %esi<br>
        testl   %esi, %esi<br>
        cmovel  %edi, %eax<br>
        popq    %rbp<br>
        ret<br>
        .cfi_endproc<br>
<br>
<br>
.subsections_via_symbols<br>
<br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>~Craig