[PATCH] More aggressive __builtin_memcpy optimizations (PR middle-end/29215)

Tobias Burnus burnus@net-b.de
Thu Nov 20 18:05:00 GMT 2008


Richard Guenther wrote:
> On Thu, Nov 20, 2008 at 4:54 PM, Jakub Jelinek <jakub@redhat.com> wrote:
>   
>> On Wed, Nov 19, 2008 at 06:23:28PM +0100, Richard Guenther wrote:
>>     
>>> The patch is ok.
>>> Ok for trunk (together with the earlier patch)?
>>>       
> Ok for the middle-end parts.
>   

And OK for the Fortran parts.

Thanks for the patch,

Tobias

>> 2008-11-20  Jakub Jelinek  <jakub@redhat.com>
>>
>>        PR middle-end/29215
>>        * builtins.c (fold_builtin_memory_op): Remove
>>        is_gimple_min_invariant and readonly_data_expr src check.
>>
>>        * trans-array.c (trans_array_constructor_value,
>>        gfc_build_constant_array_constructor): Fill in TREE_PURPOSE.
>>
>>        * gfortran.dg/array_memcpy_3.f90: Adjust pattern to match even
>>        memcpy optimized into ref-all store.
>>        * gcc.dg/pr29215.c: Adjust so that all stores are known to be
>>        aligned.
>>
>> --- gcc/builtins.c.jj   2008-11-20 14:16:50.000000000 +0100
>> +++ gcc/builtins.c      2008-11-20 14:25:38.000000000 +0100
>> @@ -8894,11 +8894,7 @@ fold_builtin_memory_op (tree dest, tree
>>             memcpy call.  This check is probably unnecessary with
>>             -fno-strict-aliasing.  Similarly for destvar.  See also
>>             PR29286.  */
>> -         else if (!var_decl_component_p (srcvar)
>> -                  /* Accept: memcpy (*char_var, "test", 1); that simplify
>> -                     to char_var='t';  */
>> -                  || is_gimple_min_invariant (srcvar)
>> -                  || readonly_data_expr (src))
>> +         else if (!var_decl_component_p (srcvar))
>>            srcvar = NULL_TREE;
>>        }
>>
>> --- gcc/fortran/trans-array.c.jj        2008-11-17 08:37:27.000000000 +0100
>> +++ gcc/fortran/trans-array.c   2008-11-20 14:16:58.000000000 +0100
>> @@ -1235,6 +1235,7 @@ gfc_trans_array_constructor_value (stmtb
>>              tree init;
>>              tree bound;
>>              tree tmptype;
>> +             HOST_WIDE_INT idx = 0;
>>
>>              p = c;
>>              list = NULL_TREE;
>> @@ -1253,7 +1254,8 @@ gfc_trans_array_constructor_value (stmtb
>>                                (gfc_get_pchar_type (p->expr->ts.kind),
>>                                 se.expr);
>>
>> -                 list = tree_cons (NULL_TREE, se.expr, list);
>> +                 list = tree_cons (build_int_cst (gfc_array_index_type,
>> +                                                  idx++), se.expr, list);
>>                  c = p;
>>                  p = p->next;
>>                }
>> @@ -1619,7 +1621,8 @@ gfc_build_constant_array_constructor (gf
>>       if (c->expr->ts.type == BT_CHARACTER && POINTER_TYPE_P (type))
>>        se.expr = gfc_build_addr_expr (gfc_get_pchar_type (c->expr->ts.kind),
>>                                       se.expr);
>> -      list = tree_cons (NULL_TREE, se.expr, list);
>> +      list = tree_cons (build_int_cst (gfc_array_index_type, nelem),
>> +                       se.expr, list);
>>       c = c->next;
>>       nelem++;
>>     }
>> --- gcc/testsuite/gfortran.dg/array_memcpy_3.f90.jj     2008-09-30 16:56:06.000000000 +0200
>> +++ gcc/testsuite/gfortran.dg/array_memcpy_3.f90        2008-11-20 16:32:56.000000000 +0100
>> @@ -11,5 +11,5 @@ subroutine bar(x)
>>   x = (/ 3, 1, 4, 1 /)
>>  end subroutine
>>
>> -! { dg-final { scan-tree-dump-times "memcpy" 2 "original" } }
>> +! { dg-final { scan-tree-dump-times "memcpy|ref-all" 2 "original" } }
>>  ! { dg-final { cleanup-tree-dump "original" } }
>> --- gcc/testsuite/gcc.dg/pr29215.c.jj   2008-11-20 14:16:50.000000000 +0100
>> +++ gcc/testsuite/gcc.dg/pr29215.c      2008-11-20 14:16:58.000000000 +0100
>> @@ -2,21 +2,16 @@
>>  /* { dg-do compile } */
>>  /* { dg-options "-O2 -fdump-tree-gimple" } */
>>
>> -char buf[5 * sizeof (int) + 1];
>> +char buf[5 * sizeof (int) + 1] __attribute__((aligned (__alignof__ (int))));
>>
>>  static void
>> -foo (char *buffer, int arg1, int arg2, int arg3, int arg4, int arg5)
>> +foo (int arg1, int arg2, int arg3, int arg4, int arg5)
>>  {
>> -  __builtin_memcpy (buffer, &arg1, sizeof (int));
>> -  buffer += sizeof (int);
>> -  __builtin_memcpy (buffer, &arg2, sizeof (int));
>> -  buffer += sizeof (int);
>> -  __builtin_memcpy (buffer, &arg3, sizeof (int));
>> -  buffer += sizeof (int);
>> -  __builtin_memcpy (buffer, &arg4, sizeof (int));
>> -  buffer += sizeof (int);
>> -  __builtin_memcpy (buffer, &arg5, sizeof (int));
>> -  buffer += sizeof (int);
>> +  __builtin_memcpy (buf, &arg1, sizeof (int));
>> +  __builtin_memcpy (buf + sizeof (int), &arg2, sizeof (int));
>> +  __builtin_memcpy (buf + 2 * sizeof (int), &arg3, sizeof (int));
>> +  __builtin_memcpy (buf + 3 * sizeof (int), &arg4, sizeof (int));
>> +  __builtin_memcpy (buf + 4 * sizeof (int), &arg5, sizeof (int));
>>  }
>>
>>  int
>> @@ -28,7 +23,7 @@ main (void)
>>   u.buf[1] = 'b';
>>   u.buf[2] = 'c';
>>   u.buf[3] = 'd';
>> -  foo (buf, u.i, u.i, u.i, u.i, u.i);
>> +  foo (u.i, u.i, u.i, u.i, u.i);
>>   buf[5 * sizeof (int)] = '\0';
>>   __builtin_puts (buf);
>>   return 0;
>>
>>        Jakub
>>
>>     
>
>   



More information about the Gcc-patches mailing list