fold-const.c (fold_ternary_loc): Also fold non-constant vector CONSTRUCTORs.

2011-10-06  Richard Guenther  <rguenther@suse.de>

	* fold-const.c (fold_ternary_loc): Also fold non-constant
	vector CONSTRUCTORs.  Make more efficient.
	* tree-ssa-dom.c (cprop_operand): Don't handle virtual operands.
	(cprop_into_stmt): Don't propagate into virtual operands.
	(optimize_stmt): Really dump original statement.

From-SVN: r179597
This commit is contained in:
Richard Guenther 2011-10-06 10:34:18 +00:00 committed by Richard Biener
parent 50000e8602
commit 69c2fbf1ec
2 changed files with 17 additions and 16 deletions

View File

@ -1,3 +1,11 @@
2011-10-06 Richard Guenther <rguenther@suse.de>
* fold-const.c (fold_ternary_loc): Also fold non-constant
vector CONSTRUCTORs. Make more efficient.
* tree-ssa-dom.c (cprop_operand): Don't handle virtual operands.
(cprop_into_stmt): Don't propagate into virtual operands.
(optimize_stmt): Really dump original statement.
2011-10-06 Nick Clifton <nickc@redhat.com>
* config/rx/rx.md (smin3): Revert previous delta.

View File

@ -13647,7 +13647,7 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
case BIT_FIELD_REF:
if ((TREE_CODE (arg0) == VECTOR_CST
|| (TREE_CODE (arg0) == CONSTRUCTOR && TREE_CONSTANT (arg0)))
|| TREE_CODE (arg0) == CONSTRUCTOR)
&& type == TREE_TYPE (TREE_TYPE (arg0)))
{
unsigned HOST_WIDE_INT width = tree_low_cst (arg1, 1);
@ -13659,24 +13659,17 @@ fold_ternary_loc (location_t loc, enum tree_code code, tree type,
&& (idx = idx / width)
< TYPE_VECTOR_SUBPARTS (TREE_TYPE (arg0)))
{
tree elements = NULL_TREE;
if (TREE_CODE (arg0) == VECTOR_CST)
elements = TREE_VECTOR_CST_ELTS (arg0);
else
{
unsigned HOST_WIDE_INT idx;
tree value;
FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (arg0), idx, value)
elements = tree_cons (NULL_TREE, value, elements);
tree elements = TREE_VECTOR_CST_ELTS (arg0);
while (idx-- > 0 && elements)
elements = TREE_CHAIN (elements);
if (elements)
return TREE_VALUE (elements);
}
while (idx-- > 0 && elements)
elements = TREE_CHAIN (elements);
if (elements)
return TREE_VALUE (elements);
else
return build_zero_cst (type);
else if (idx < CONSTRUCTOR_NELTS (arg0))
return CONSTRUCTOR_ELT (arg0, idx)->value;
return build_zero_cst (type);
}
}