re PR tree-optimization/92715 (error: position plus size exceeds size of referenced object in ‘bit_field_ref’)

2019-11-29  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/92715
	* tree-ssa-forwprop.c (simplify_vector_constructor): Bail
	out for uniform vectors and source vectors with less elements
	than the destination.

	* gcc.dg/torture/pr92715.c: New testcase.

From-SVN: r278833
This commit is contained in:
Richard Biener 2019-11-29 09:18:48 +00:00 committed by Richard Biener
parent 52702016ad
commit 438d9c4afa
4 changed files with 36 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2019-11-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/92715
* tree-ssa-forwprop.c (simplify_vector_constructor): Bail
out for uniform vectors and source vectors with less elements
than the destination.
2019-11-29 Martin Liska <mliska@suse.cz>
PR lto/91574

View File

@ -1,3 +1,8 @@
2019-11-29 Richard Biener <rguenther@suse.de>
PR tree-optimization/92715
* gcc.dg/torture/pr92715.c: New testcase.
2019-11-29 Jakub Jelinek <jakub@redhat.com>
PR c++/60228

View File

@ -0,0 +1,17 @@
/* { dg-do compile } */
/* { dg-additional-options "-mavx2" { target x86_64-*-* i?86-*-* } } */
typedef double v4si __attribute__((vector_size(32)));
typedef double v2si __attribute__((vector_size(16)));
void foo (v4si *dstp, v2si *srcp)
{
v2si src = *srcp;
*dstp = (v4si) { src[0], src[1], src[0], src[1] };
}
void bar (v4si *dstp, v2si *srcp)
{
v2si src = *srcp;
*dstp = (v4si) { src[0], src[0], src[0], src[0] };
}

View File

@ -2038,13 +2038,13 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
constructor_elt *elt;
bool maybe_ident;
gcc_checking_assert (gimple_assign_rhs_code (stmt) == CONSTRUCTOR);
op = gimple_assign_rhs1 (stmt);
type = TREE_TYPE (op);
gcc_checking_assert (TREE_CODE (type) == VECTOR_TYPE);
gcc_checking_assert (TREE_CODE (op) == CONSTRUCTOR
&& TREE_CODE (type) == VECTOR_TYPE);
if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts))
if (!TYPE_VECTOR_SUBPARTS (type).is_constant (&nelts)
|| uniform_vector_p (op))
return false;
elem_type = TREE_TYPE (type);
elem_size = TREE_INT_CST_LOW (TYPE_SIZE (elem_type));
@ -2136,6 +2136,9 @@ simplify_vector_constructor (gimple_stmt_iterator *gsi)
|| ! VECTOR_TYPE_P (TREE_TYPE (orig[0])))
return false;
refnelts = TYPE_VECTOR_SUBPARTS (TREE_TYPE (orig[0])).to_constant ();
/* We currently do not handle larger destination vectors. */
if (refnelts < nelts)
return false;
if (maybe_ident)
{