mirror of git://gcc.gnu.org/git/gcc.git
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
|
|
@ -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>
|
2018-12-10 Segher Boessenkool <segher@kernel.crashing.org>
|
||||||
|
|
||||||
* config.gcc (Obsolete configurations): Delete powerpc*-*-*spe*.
|
* config.gcc (Obsolete configurations): Delete powerpc*-*-*spe*.
|
||||||
|
|
|
||||||
|
|
@ -272,15 +272,16 @@ builtin_memref::builtin_memref (tree expr, tree size)
|
||||||
|
|
||||||
offset_int maxoff = maxobjsize;
|
offset_int maxoff = maxobjsize;
|
||||||
tree basetype = TREE_TYPE (base);
|
tree basetype = TREE_TYPE (base);
|
||||||
if (TREE_CODE (basetype) == ARRAY_TYPE
|
if (TREE_CODE (basetype) == ARRAY_TYPE)
|
||||||
&& ref
|
{
|
||||||
&& array_at_struct_end_p (ref))
|
if (ref && array_at_struct_end_p (ref))
|
||||||
; /* Use the maximum possible offset for last member arrays. */
|
; /* Use the maximum possible offset for last member arrays. */
|
||||||
else if (tree basesize = TYPE_SIZE_UNIT (basetype))
|
else if (tree basesize = TYPE_SIZE_UNIT (basetype))
|
||||||
if (TREE_CODE (basesize) == INTEGER_CST)
|
if (TREE_CODE (basesize) == INTEGER_CST)
|
||||||
/* Size could be non-constant for a variable-length type such
|
/* Size could be non-constant for a variable-length type such
|
||||||
as a struct with a VLA member (a GCC extension). */
|
as a struct with a VLA member (a GCC extension). */
|
||||||
maxoff = wi::to_offset (basesize);
|
maxoff = wi::to_offset (basesize);
|
||||||
|
}
|
||||||
|
|
||||||
if (offrange[0] >= 0)
|
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>
|
2018-12-10 Uros Bizjak <ubizjak@gmail.com>
|
||||||
|
|
||||||
* gcc.dg/sinatan-1.c: Use dg-add-options ieee.
|
* gcc.dg/sinatan-1.c: Use dg-add-options ieee.
|
||||||
|
|
|
||||||
|
|
@ -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…
Reference in New Issue