Consider this simple loop:

int shift_integer (int value, unsigned int amount)
{
  unsigned int i;

  for (i=0; i<amount; i++)
   value<<=1;

  return value;
}

The compiler generates aloop to evalue the result and does not strength-reduce
the calculation.

A slightly different version of that loop gets strength-reduced. I just
replaced the shift with an add.

int inc_integer (int value, unsigned int amount)
{
  unsigned int i;

  for (i=0; i<amount; i++)
   value+=1;

  return value;
}

Tested with gcc 4.3.0 i686-pc-cygwin. 

Assembly-Output with -O3 -fomit-frame-pointer:

        .file   "test.c"
        .text
        .p2align 4,,15
.globl _shift_integer
        .def    _shift_integer; .scl    2;      .type   32;     .endef
_shift_integer:
        movl    8(%esp), %ecx
        movl    4(%esp), %eax
        testl   %ecx, %ecx
        je      L2
        xorl    %edx, %edx
        .p2align 4,,7
L3:
        addl    $1, %edx
        addl    %eax, %eax
        cmpl    %edx, %ecx
        ja      L3
L2:
        rep
        ret
        .p2align 4,,15
.globl _inc_integer
        .def    _inc_integer;   .scl    2;      .type   32;     .endef
_inc_integer:
        movl    8(%esp), %edx
        movl    4(%esp), %eax
        testl   %edx, %edx      
        je      L8             
        addl    %edx, %eax
L8:
        rep
        ret


-- 
           Summary: shift operator strength reduction in loops not done.
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Severity: enhancement
          Priority: P3
         Component: tree-optimization
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: n dot pipenbrinck at cubic dot org


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

Reply via email to