summaryrefslogtreecommitdiffstats
path: root/gcc/fold-const.c
diff options
context:
space:
mode:
authorglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-30 12:56:47 +0000
committerglisse <glisse@138bc75d-0d04-0410-961f-82ee72b054a4>2012-10-30 12:56:47 +0000
commitf1656bce2424b1c9686485ecb7078edb4f59e624 (patch)
tree43e796b6b41df8a8571952bfe92a803c5aec082f /gcc/fold-const.c
parent7b93616c01daf786fa6654df3b00d62194694da7 (diff)
downloadppe42-gcc-f1656bce2424b1c9686485ecb7078edb4f59e624.tar.gz
ppe42-gcc-f1656bce2424b1c9686485ecb7078edb4f59e624.zip
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@192986 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/fold-const.c')
-rw-r--r--gcc/fold-const.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index e3e4151ae60..0caca2e5794 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -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,
OpenPOWER on IntegriCloud