PR tree-optimization/86196 - Bogus -Wrestrict on memcpy between array elements at unequal indices
gcc/ChangeLog: PR tree-optimization/86196 * gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use base size only of arrays. gcc/testsuite/ChangeLog: PR tree-optimization/86196 * gcc.dg/Wrestrict-18.c: New test. From-SVN: r266967
This commit is contained in:
parent
03da9b757b
commit
1486eb791f
4 changed files with 59 additions and 9 deletions
|
@ -1,3 +1,9 @@
|
|||
2018-12-10 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR tree-optimization/86196
|
||||
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use
|
||||
base size only of arrays.
|
||||
|
||||
2018-12-10 Segher Boessenkool <segher@kernel.crashing.org>
|
||||
|
||||
* config.gcc (Obsolete configurations): Delete powerpc*-*-*spe*.
|
||||
|
|
|
@ -272,15 +272,16 @@ builtin_memref::builtin_memref (tree expr, tree size)
|
|||
|
||||
offset_int maxoff = maxobjsize;
|
||||
tree basetype = TREE_TYPE (base);
|
||||
if (TREE_CODE (basetype) == ARRAY_TYPE
|
||||
&& ref
|
||||
&& array_at_struct_end_p (ref))
|
||||
; /* Use the maximum possible offset for last member arrays. */
|
||||
else if (tree basesize = TYPE_SIZE_UNIT (basetype))
|
||||
if (TREE_CODE (basesize) == INTEGER_CST)
|
||||
/* Size could be non-constant for a variable-length type such
|
||||
as a struct with a VLA member (a GCC extension). */
|
||||
maxoff = wi::to_offset (basesize);
|
||||
if (TREE_CODE (basetype) == ARRAY_TYPE)
|
||||
{
|
||||
if (ref && array_at_struct_end_p (ref))
|
||||
; /* Use the maximum possible offset for last member arrays. */
|
||||
else if (tree basesize = TYPE_SIZE_UNIT (basetype))
|
||||
if (TREE_CODE (basesize) == INTEGER_CST)
|
||||
/* Size could be non-constant for a variable-length type such
|
||||
as a struct with a VLA member (a GCC extension). */
|
||||
maxoff = wi::to_offset (basesize);
|
||||
}
|
||||
|
||||
if (offrange[0] >= 0)
|
||||
{
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2018-12-10 Martin Sebor <msebor@redhat.com>
|
||||
|
||||
PR tree-optimization/86196
|
||||
* gimple-ssa-warn-restrict.c (builtin_memref::builtin_memref): Use
|
||||
base size only of arrays.
|
||||
|
||||
2018-12-10 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
* gcc.dg/sinatan-1.c: Use dg-add-options ieee.
|
||||
|
|
37
gcc/testsuite/gcc.dg/Wrestrict-18.c
Normal file
37
gcc/testsuite/gcc.dg/Wrestrict-18.c
Normal file
|
@ -0,0 +1,37 @@
|
|||
/* PR tree-optimization/86196 - Bogus -Wrestrict on memcpy between array
|
||||
elements at unequal indices
|
||||
{ dg-do compile }
|
||||
{ dg-options "-O2 -Wall" } */
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
extern void* memcpy (void*, const void*, size_t);
|
||||
|
||||
struct S
|
||||
{
|
||||
int n;
|
||||
void * p;
|
||||
};
|
||||
|
||||
/* Test case submitted in the PR. */
|
||||
|
||||
void pr86196_c0 (struct S * a, size_t n)
|
||||
{
|
||||
for (size_t i = 0, j = 0; i != n; ++i)
|
||||
{
|
||||
if (a[i].n == 0)
|
||||
{
|
||||
if (i != j)
|
||||
memcpy (&a[j], &a[i], sizeof (struct S)); /* { dg-bogus "\\\[-Wrestrict" } */
|
||||
++j;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Reduced test case. */
|
||||
|
||||
void pr86196_c1 (struct S *a, int i, int j)
|
||||
{
|
||||
if (i != j)
|
||||
memcpy (&a[j], &a[i], sizeof (struct S)); /* { dg-bogus "\\\[-Wrestrict" } */
|
||||
}
|
Loading…
Add table
Reference in a new issue