The following program give wrong results when compiled in O1:

#include "stdio.h"

int v[]= {10,20,30,40,50};

inline int inc(int i)
{
  int * pi = &i;
  int res;

  asm volatile("\tmovl (%1), %0\n"
               "\tincl %0\n"
               :"=r" (res)  : "r" (pi));

  return res;
}



int
main (){

  int i;

  for(i=0; i<5; i++)
    v[i] = inc(v[i]);


  for(i=0; i<5; i++)
    printf("%d\n",v[i]);


  return i;
}

> ./a.out
134513615
134513615
134513615
134513615
134513615

while when compiled without optimizations it works:
> ./a.out                                     
11
21
31
41
51


-- 
           Summary: error in loop invariant motion tranformation
           Product: gcc
           Version: 4.1.1
            Status: UNCONFIRMED
          Severity: minor
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: alessandro dot lonardo at roma1 dot infn dot it
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=27725

Reply via email to