fold-const.c (fold_binary_op_with_conditional_arg): Handle vectors.
authorMarc Glisse <marc.glisse@inria.fr>
Tue, 30 Oct 2012 12:56:47 +0000 (13:56 +0100)
committerMarc Glisse <glisse@gcc.gnu.org>
Tue, 30 Oct 2012 12:56:47 +0000 (12:56 +0000)
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

gcc/ChangeLog
gcc/fold-const.c

index 467bec3c3c7649d5386a374b71518010af34f881..8cf846bbd62a9cfeb5f7d93c1c891955ec9a568c 100644 (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>
 
index e3e4151ae60a42ae1210500ad603d8606d71884d..0caca2e579468acd8c75e5d876723819edd16608 100644 (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);
 }
 
 \f
@@ -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,