On 1 October 2012 18:34, reed kotler <span dir="ltr"><<a href="mailto:rkotler@mips.com" target="_blank">rkotler@mips.com</a>></span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


  

    
  
  <div text="#000000" bgcolor="#FFFFFF">
    This code is essentially from an LTP test (
    
    <a href="http://ltp.sourceforge.net/" target="_blank"> http://ltp.sourceforge.net/</a>
    ).<br>
    <br>
    <br>
    #include <stdlib.h><br>
    <br>
    int main() {<br>
      void  *curr;<br>
    <br>
      do {<br>
        curr = malloc(1);<br>
      } while (curr);<br>
    <br>
      return 0;<br>
    <br>
    }<br>
    <br>
    If you compile it with no optimization, it will keep the malloc
    calls.<br>
    <br>
    If you compile it with -O2, it will create an infinite loop, i.e.
    assuming that malloc always returns a non zero result and the result
    is not used.<br></div></blockquote><div><br></div><div>As far as I know, this optimization is legal. Fix the test with a volatile pointer:</div><div><br></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">int main() {</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  volatile char *curr;</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  do {</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">    curr = malloc(1);</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">    int i = *curr;</span></div>

<div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">    (void)i;</span></div><div><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  } while (curr);</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)"><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">  return 0;</span><br style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;background-color:rgb(255,255,255)">

<span style="background-color:rgb(255,255,255);color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px">}</span></div><div><br></div><div>which produces:</div><div><br></div><div><div>        pushq   %rax</div></div>

<div><div>.Ltmp1:</div></div><div>        movl    $1, %edi</div><div><div>        callq   malloc</div><div>        movb    (%rax), %cl</div><div>        testq   %rax, %rax</div><div>        jne     .LBB0_1</div></div><div>

<div># BB#2:                                 # %do.end</div><div>        xorl    %eax, %eax</div><div>        popq    %rdx</div><div>        ret</div></div><div><br></div><div>Oh how people don't appreciate the luxury of having an infinite memory machine!</div>

<div><br></div><div>Nick</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div text="#000000" bgcolor="#FFFFFF">~/llvmpb/install/bin/clang loop.c -O2 -S<br>


    <br>
        .file    "loop.c"<br>
        .text<br>
        .globl    main<br>
        .align    16, 0x90<br>
        .type    main,@function<br>
    main:                                   # @main<br>
        .cfi_startproc<br>
    # BB#0:                                 # %entry<br>
        .align    16, 0x90<br>
    .LBB0_1:                                # %do.body<br>
                                            # =>This Inner Loop
    Header: Depth=1<br>
        jmp    .LBB0_1<br>
    .Ltmp0:<br>
        .size    main, .Ltmp0-main<br>
        .cfi_endproc<br>
    <br>
    <br>
        .section    ".note.GNU-stack","",@progbits<br>
    <br>
  </div>

<br>_______________________________________________<br>
LLVM Developers mailing list<br>
<a href="mailto:LLVMdev@cs.uiuc.edu">LLVMdev@cs.uiuc.edu</a>         <a href="http://llvm.cs.uiuc.edu" target="_blank">http://llvm.cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev</a><br>
<br></blockquote></div><br>