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

            Bug ID: 66646
           Summary: small loop turned into memmove because of tree ldist
           Product: gcc
           Version: 6.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: tree-optimization
          Assignee: unassigned at gcc dot gnu.org
          Reporter: amker at gcc dot gnu.org
  Target Milestone: ---

Considering below small case
int foo (int flag, char *a)                                                    
{                                                                              
  short i, j;                                                                  
  short l = 0;                                                                 
  if (flag == 1)                                                               
    l = 3;                                                                     

  for (i = 0; i < 4; i++)                                                      
    {                                                                          
      for (j = l - 1; j > 0; j--)                                              
        a[j] = a[j - 1];                                                       
      a[0] = i;                                                                
    }                                                                          
}
After revision 224020, SCEV can recognize &a[j], &a[j-1].  pass ldist decides
to replace the inner loop with memmove.  Since it's a small loop, most likely
this results in peformance regression.  We need:
A) compute more accurate loop niter bound in such case so that optimizers know
it's small loop.
B) don't turn loop into mem* call if it's small loop.

Reply via email to