re PR tree-optimization/33614 (ICE on semi-constant vector CONSTRUCTORs)

gcc/
	PR tree-optimization/33614
	* gimplify.c (gimplify_init_constructor): Gimplify vector constructors
	if they can't be reduced to VECTOR_CSTs and aren't legitimate
	initializer constants.

gcc/testsuite/
	PR tree-optimization/33614
	* gcc.c-torture/compile/pr33614.c: New test.

From-SVN: r129739
This commit is contained in:
Richard Sandiford 2007-10-29 22:01:24 +00:00 committed by Richard Sandiford
parent 5a347f2b40
commit 9f1da821e6
4 changed files with 30 additions and 4 deletions

View File

@ -1,3 +1,10 @@
2007-10-29 Richard Sandiford <rsandifo@nildram.co.uk>
PR tree-optimization/33614
* gimplify.c (gimplify_init_constructor): Gimplify vector constructors
if they can't be reduced to VECTOR_CSTs and aren't legitimate
initializer constants.
2007-10-29 Richard Guenther <rguenther@suse.de>
PR tree-optimization/33870

View File

@ -3290,8 +3290,9 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
tree value;
/* Even when ctor is constant, it might contain non-*_CST
elements (e.g. { 1.0/0.0 - 1.0/0.0, 0.0 }) and those don't
belong into VECTOR_CST nodes. */
elements, such as addresses or trapping values like
1.0/0.0 - 1.0/0.0. Such expressions don't belong
in VECTOR_CST nodes. */
FOR_EACH_CONSTRUCTOR_VALUE (elts, ix, value)
if (!CONSTANT_CLASS_P (value))
{
@ -3305,10 +3306,14 @@ gimplify_init_constructor (tree *expr_p, tree *pre_p,
break;
}
/* Don't reduce a TREE_CONSTANT vector ctor even if we can't
/* Don't reduce an initializer constant even if we can't
make a VECTOR_CST. It won't do anything for us, and it'll
prevent us from representing it as a single constant. */
break;
if (initializer_constant_valid_p (ctor, type))
break;
TREE_CONSTANT (ctor) = 0;
TREE_INVARIANT (ctor) = 0;
}
/* Vector types use CONSTRUCTOR all the way through gimple

View File

@ -1,3 +1,8 @@
2007-10-29 Richard Sandiford <rsandifo@nildram.co.uk>
PR tree-optimization/33614
* gcc.c-torture/compile/pr33614.c: New test.
2007-10-29 Richard Guenther <rguenther@suse.de>
PR tree-optimization/33870

View File

@ -0,0 +1,9 @@
typedef float V2SF __attribute__ ((vector_size (8)));
V2SF
foo (int x, V2SF a)
{
while (x--)
a += (V2SF) {1.0f/0.0f - 1.0f/0.0f, 1.0f/0.0f - 1.0f/0.0f};
return a;
}