From: glisse Date: Tue, 30 Oct 2012 12:56:47 +0000 (+0000) Subject: 2012-10-30 Marc Glisse X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f1656bce2424b1c9686485ecb7078edb4f59e624;p=thirdparty%2Fgcc.git 2012-10-30 Marc Glisse * 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 467bec3c3c76..8cf846bbd62a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2012-10-30 Marc Glisse + + * 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 Tejas Belagod diff --git a/gcc/fold-const.c b/gcc/fold-const.c index e3e4151ae60a..0caca2e57946 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,