backport: re PR tree-optimization/85257 (wrong code with -O -fno-tree-ccp and reading zeroed vector member)

Backported from mainline
	2018-04-07  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/85257
	* fold-const.c (native_encode_vector): If not all elts could fit
	and off is -1, return 0 rather than offset.
	* tree-ssa-sccvn.c (vn_reference_lookup_3): Pass
	(offset - offset2) / BITS_PER_UNIT as 4th argument to
	native_encode_expr.  Verify len * BITS_PER_UNIT >= maxsizei.  Don't
	adjust buffer in native_interpret_expr call.

	* gcc.dg/pr85257.c: New test.

From-SVN: r261951
This commit is contained in:
Jakub Jelinek 2018-06-22 23:08:47 +02:00 committed by Jakub Jelinek
parent 7b42eb87dc
commit b8e47758b5
5 changed files with 40 additions and 7 deletions

View File

@ -1,6 +1,16 @@
2018-06-22 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2018-04-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/85257
* fold-const.c (native_encode_vector): If not all elts could fit
and off is -1, return 0 rather than offset.
* tree-ssa-sccvn.c (vn_reference_lookup_3): Pass
(offset - offset2) / BITS_PER_UNIT as 4th argument to
native_encode_expr. Verify len * BITS_PER_UNIT >= maxsizei. Don't
adjust buffer in native_interpret_expr call.
2018-04-06 Jakub Jelinek <jakub@redhat.com>
PR debug/85252

View File

@ -7205,7 +7205,7 @@ native_encode_vector (const_tree expr, unsigned char *ptr, int len, int off)
return 0;
offset += res;
if (offset >= len)
return offset;
return (off == -1 && i < count - 1) ? 0 : offset;
if (off != -1)
off = 0;
}

View File

@ -1,6 +1,11 @@
2018-06-22 Jakub Jelinek <jakub@redhat.com>
Backported from mainline
2018-04-07 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/85257
* gcc.dg/pr85257.c: New test.
2018-04-06 Jakub Jelinek <jakub@redhat.com>
PR debug/85252

View File

@ -0,0 +1,20 @@
/* PR tree-optimization/85257 */
/* { dg-do run { target int128 } } */
/* { dg-options "-O2 -fno-tree-ccp" } */
typedef __int128 V __attribute__ ((__vector_size__ (16 * sizeof (__int128))));
__int128 __attribute__ ((noinline, noclone))
foo (void)
{
V v = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
return v[5];
}
int
main ()
{
if (foo () != 6)
__builtin_abort ();
return 0;
}

View File

@ -1981,8 +1981,9 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
if (TREE_CODE (rhs) == SSA_NAME)
rhs = SSA_VAL (rhs);
len = native_encode_expr (gimple_assign_rhs1 (def_stmt),
buffer, sizeof (buffer));
if (len > 0)
buffer, sizeof (buffer),
(offset - offset2) / BITS_PER_UNIT);
if (len > 0 && len * BITS_PER_UNIT >= ref->size)
{
tree type = vr->type;
/* Make sure to interpret in a type that has a range
@ -1991,10 +1992,7 @@ vn_reference_lookup_3 (ao_ref *ref, tree vuse, void *vr_,
&& ref->size != TYPE_PRECISION (vr->type))
type = build_nonstandard_integer_type (ref->size,
TYPE_UNSIGNED (type));
tree val = native_interpret_expr (type,
buffer
+ ((offset - offset2)
/ BITS_PER_UNIT),
tree val = native_interpret_expr (type, buffer,
ref->size / BITS_PER_UNIT);
/* If we chop off bits because the types precision doesn't
match the memory access size this is ok when optimizing