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

           Summary: inefficient PRE bloat code size
           Product: gcc
           Version: 4.6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: xinlian...@gmail.com
                CC: xinlian...@gmail.com


// Example:

int a[100];
int foo(int x, int* y, int z)
{ 
  int m; 
  if (x)
  {
     *y = z;
     a[x]  = z;
  }
  m = *y; // *y misses often
  return m + a[x];
}

with PRE, gcc converts the code to:

int a[100];
int foo(int x, int* y, int z)
{ 
  int m; 
  if (x)
  {
     *y = z;
     a[x]  = z;         (1)
     tem = *y;          (2)    
  }
  else
  {
     tem = *y;          (3)
  }
  m = tem; 
  return m + a[x];
}

DUe to may def at (1), *y needs to be reloaded at (2), so hoisting load of *y
to (3) does not reduce any redundency --- but simply bloat up code size.

foo:
.LFB0:
    .cfi_startproc
    testl    %edi, %edi
    je    .L5
    movl    %edx, (%rsi)
    movslq    %edi, %rdi
    movl    %edx, a(,%rdi,4)
    movl    (%rsi), %eax
    addl    %edx, %eax
    ret
    .p2align 4,,10
    .p2align 3
.L5:
    movl    a(%rip), %edx
    movl    (%rsi), %eax
    addl    %edx, %eax
    ret
    .cfi_endproc
.LFE0:


David

Reply via email to