Commit 2e2e628b by Marc Glisse Committed by Marc Glisse

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
parent 4fda1ad1
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> 2012-10-30 James Greenhalgh <james.greenhalgh@arm.com>
Tejas Belagod <tejas.belagod@arm.com> Tejas Belagod <tejas.belagod@arm.com>
...@@ -5959,8 +5959,10 @@ fold_binary_op_with_conditional_arg (location_t loc, ...@@ -5959,8 +5959,10 @@ fold_binary_op_with_conditional_arg (location_t loc,
tree test, true_value, false_value; tree test, true_value, false_value;
tree lhs = NULL_TREE; tree lhs = NULL_TREE;
tree rhs = 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); test = TREE_OPERAND (cond, 0);
true_value = TREE_OPERAND (cond, 1); true_value = TREE_OPERAND (cond, 1);
...@@ -5981,6 +5983,9 @@ fold_binary_op_with_conditional_arg (location_t loc, ...@@ -5981,6 +5983,9 @@ fold_binary_op_with_conditional_arg (location_t loc,
false_value = constant_boolean_node (false, testtype); 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 /* 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 in a SAVE_EXPR and the operation can be simplified on at least one
of the branches once its pushed inside the COND_EXPR. */ of the branches once its pushed inside the COND_EXPR. */
...@@ -6011,7 +6016,7 @@ fold_binary_op_with_conditional_arg (location_t loc, ...@@ -6011,7 +6016,7 @@ fold_binary_op_with_conditional_arg (location_t loc,
if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs)) if (!TREE_CONSTANT (arg) && !TREE_CONSTANT (lhs) && !TREE_CONSTANT (rhs))
return NULL_TREE; 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, ...@@ -9871,7 +9876,9 @@ fold_binary_loc (location_t loc,
tem); 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, tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
arg0, arg1, arg0, arg1,
...@@ -9880,7 +9887,9 @@ fold_binary_loc (location_t loc, ...@@ -9880,7 +9887,9 @@ fold_binary_loc (location_t loc,
return tem; 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, tem = fold_binary_op_with_conditional_arg (loc, code, type, op0, op1,
arg1, arg0, arg1, arg0,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment