re PR tree-optimization/15419 (memcpy pessimization)
2011-05-23 Richard Guenther <rguenther@suse.de> PR middle-end/15419 * builtins.c (fold_builtin_memory_op): Be less restrictive about what pointer types we accept for folding. * gcc.dg/memcpy-3.c: New testcase. From-SVN: r174065
This commit is contained in:
parent
c80286502f
commit
9a9822e13e
4 changed files with 31 additions and 11 deletions
|
@ -1,3 +1,9 @@
|
|||
2011-05-23 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/15419
|
||||
* builtins.c (fold_builtin_memory_op): Be less restrictive about
|
||||
what pointer types we accept for folding.
|
||||
|
||||
2011-05-23 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE>
|
||||
|
||||
* gthr-gnat.c: Remove.
|
||||
|
|
|
@ -8509,6 +8509,9 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
|
|||
Perhaps we ought to inherit type from non-VOID argument here? */
|
||||
STRIP_NOPS (src);
|
||||
STRIP_NOPS (dest);
|
||||
if (!POINTER_TYPE_P (TREE_TYPE (src))
|
||||
|| !POINTER_TYPE_P (TREE_TYPE (dest)))
|
||||
return NULL_TREE;
|
||||
/* As we fold (void *)(p + CST) to (void *)p + CST undo this here. */
|
||||
if (TREE_CODE (src) == POINTER_PLUS_EXPR)
|
||||
{
|
||||
|
@ -8525,8 +8528,7 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
|
|||
dest = build1 (NOP_EXPR, TREE_TYPE (tem), dest);
|
||||
}
|
||||
srctype = TREE_TYPE (TREE_TYPE (src));
|
||||
if (srctype
|
||||
&& TREE_CODE (srctype) == ARRAY_TYPE
|
||||
if (TREE_CODE (srctype) == ARRAY_TYPE
|
||||
&& !tree_int_cst_equal (TYPE_SIZE_UNIT (srctype), len))
|
||||
{
|
||||
srctype = TREE_TYPE (srctype);
|
||||
|
@ -8534,21 +8536,15 @@ fold_builtin_memory_op (location_t loc, tree dest, tree src,
|
|||
src = build1 (NOP_EXPR, build_pointer_type (srctype), src);
|
||||
}
|
||||
desttype = TREE_TYPE (TREE_TYPE (dest));
|
||||
if (desttype
|
||||
&& TREE_CODE (desttype) == ARRAY_TYPE
|
||||
if (TREE_CODE (desttype) == ARRAY_TYPE
|
||||
&& !tree_int_cst_equal (TYPE_SIZE_UNIT (desttype), len))
|
||||
{
|
||||
desttype = TREE_TYPE (desttype);
|
||||
STRIP_NOPS (dest);
|
||||
dest = build1 (NOP_EXPR, build_pointer_type (desttype), dest);
|
||||
}
|
||||
if (!srctype || !desttype
|
||||
|| TREE_ADDRESSABLE (srctype)
|
||||
|| TREE_ADDRESSABLE (desttype)
|
||||
|| !TYPE_SIZE_UNIT (srctype)
|
||||
|| !TYPE_SIZE_UNIT (desttype)
|
||||
|| TREE_CODE (TYPE_SIZE_UNIT (srctype)) != INTEGER_CST
|
||||
|| TREE_CODE (TYPE_SIZE_UNIT (desttype)) != INTEGER_CST)
|
||||
if (TREE_ADDRESSABLE (srctype)
|
||||
|| TREE_ADDRESSABLE (desttype))
|
||||
return NULL_TREE;
|
||||
|
||||
src_align = get_pointer_alignment (src, BIGGEST_ALIGNMENT);
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2011-05-23 Richard Guenther <rguenther@suse.de>
|
||||
|
||||
PR middle-end/15419
|
||||
* gcc.dg/memcpy-3.c: New testcase.
|
||||
|
||||
2011-05-23 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR middle-end/48973
|
||||
|
|
13
gcc/testsuite/gcc.dg/memcpy-3.c
Normal file
13
gcc/testsuite/gcc.dg/memcpy-3.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O -fdump-tree-optimized" } */
|
||||
|
||||
int get_int(const void *p)
|
||||
{
|
||||
int w;
|
||||
__builtin_memcpy(&w, p, sizeof (int));
|
||||
return w;
|
||||
}
|
||||
|
||||
/* { dg-final { scan-tree-dump-not "memcpy" "optimized" } } */
|
||||
/* { dg-final { scan-tree-dump-times "MEM" 1 "optimized" } } */
|
||||
/* { dg-final { cleanup-tree-dump "optimized" } } */
|
Loading…
Add table
Reference in a new issue