fold-const.c (fold_binary_op_with_conditional_arg): Handle vectors.

2012-10-30  Marc Glisse  <marc.glisse@inria.fr>

	* fold-const.c (fold_binary_op_with_conditional_arg): Handle vectors.
	(fold_binary_loc): call it for VEC_COND_EXPR.

From-SVN: r192986
This commit is contained in:
Marc Glisse 2012-10-30 13:56:47 +01:00 committed by Marc Glisse
parent 4fda1ad1dc
commit 2e2e628b24
2 changed files with 18 additions and 4 deletions

View file

@ -1,3 +1,8 @@
2012-10-30 Marc Glisse <marc.glisse@inria.fr>
* fold-const.c (fold_binary_op_with_conditional_arg): Handle vectors.
(fold_binary_loc): call it for VEC_COND_EXPR.
2012-10-30 James Greenhalgh <james.greenhalgh@arm.com>
Tejas Belagod <tejas.belagod@arm.com>

View file

@ -5959,8 +5959,10 @@ fold_binary_op_with_conditional_arg (location_t loc,
tree test, true_value, false_value;
tree lhs = NULL_TREE;
tree rhs = NULL_TREE;
enum tree_code cond_code = COND_EXPR;
if (TREE_CODE (cond) == COND_EXPR)
if (TREE_CODE (cond) == COND_EXPR
|| TREE_CODE (cond) == VEC_COND_EXPR)
{
test = TREE_OPERAND (cond, 0);
true_value = TREE_OPERAND (cond, 1);
@ -5981,6 +5983,9 @@ fold_binary_op_with_conditional_arg (location_t loc,
false_value = constant_boolean_node (false, testtype);
}
if (TREE_CODE (TREE_TYPE (test)) == VECTOR_TYPE)
cond_code = VEC_COND_EXPR;
/* This transformation is only worthwhile if we don't have to wrap ARG
in a SAVE_EXPR and the operation can be simplified on at least one
of the branches once its pushed inside the COND_EXPR. */
@ -6011,7 +6016,7 @@ fold_binary_op_with_conditional_arg (location_t loc,
if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs))
return NULL_TREE;
return fold_build3_loc (loc, COND_EXPR, type, test, lhs, rhs);
return fold_build3_loc (loc, cond_code, type, test, lhs, rhs);
}
@ -9871,7 +9876,9 @@ fold_binary_loc (location_t loc,
tem);
}
if (TREE_CODE (arg0) == COND_EXPR || COMPARISON_CLASS_P (arg0))
if (TREE_CODE (arg0) == COND_EXPR
|| TREE_CODE (arg0) == VEC_COND_EXPR
|| COMPARISON_CLASS_P (arg0))
{
tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
arg0, arg1,
@ -9880,7 +9887,9 @@ fold_binary_loc (location_t loc,
return tem;
}
if (TREE_CODE (arg1) == COND_EXPR || COMPARISON_CLASS_P (arg1))
if (TREE_CODE (arg1) == COND_EXPR
|| TREE_CODE (arg1) == VEC_COND_EXPR
|| COMPARISON_CLASS_P (arg1))
{
tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
arg1, arg0,