https://gcc.gnu.org/bugzilla/show_bug.cgi?id=65136

            Bug ID: 65136
           Summary: VRP inserts unnecessary constant copy in the loop
           Product: gcc
           Version: unknown
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: izamyatin at gmail dot com

For the following piece of code

int foo (unsigned int cc)
{

   while ( cc >> 16 )
      {
      cc = (cc & 0xffff) + (cc >> 16);
      }

   return cc == 1;
}

at o2 we have 

        movl    %edi, %eax
        shrl    $16, %eax
        testl   %eax, %eax
        je      .L2
        .p2align 4,,10
        .p2align 3
.L3:
        movzwl  %di, %edi
        addl    %eax, %edi
        movl    $1, %eax        
        movl    %edi, %edx
        shrl    $16, %edx
        testl   %edx, %edx
        jne     .L3

while with -fno-tree-vrp

        jmp     .L8
        .p2align 4,,10
        .p2align 3
.L3:
        movzwl  %di, %edi
        addl    %eax, %edi
.L8:
        movl    %edi, %eax
        shrl    $16, %eax
        testl   %eax, %eax
        jne     .L3


vrp changes loop in a following way

  <bb 4>:
  # cc_12 = PHI <cc_2(D)(3), cc_5(4)>
  # _13 = PHI <_11(3), 1(4)>
  _4 = cc_12 & 65535;
  cc_5 = _13 + _4;
  _3 = cc_5 >> 16;
  if (_3 != 0)
    goto <bb 4>;
  else
    goto <bb 5>;

resulted in constant copy to be inserted.

Reply via email to