Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk.

Richard.

2015-08-04  Richard Biener  <rguent...@suse.de>

        * gimple-fold.c (gimple_fold_stmt_to_constant_1): Remove
        dispatching to fold_binary for GIMPLE_BINARY_RHS and for
        comparisons embedded in [VEC_]COND_EXPRs.

Index: gcc/gimple-fold.c
===================================================================
--- gcc/gimple-fold.c   (revision 226489)
+++ gcc/gimple-fold.c   (working copy)
@@ -5008,28 +5008,26 @@ gimple_fold_stmt_to_constant_1 (gimple s
            return NULL_TREE;
 
           case GIMPLE_BINARY_RHS:
-            {
-              /* Handle binary operators that can appear in GIMPLE form.  */
-              tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
-              tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
-
-             /* Translate &x + CST into an invariant form suitable for
-                further propagation.  */
-             if (gimple_assign_rhs_code (stmt) == POINTER_PLUS_EXPR
-                 && TREE_CODE (op0) == ADDR_EXPR
-                 && TREE_CODE (op1) == INTEGER_CST)
-               {
-                 tree off = fold_convert (ptr_type_node, op1);
-                 return build_fold_addr_expr_loc
-                          (loc,
-                           fold_build2 (MEM_REF,
-                                        TREE_TYPE (TREE_TYPE (op0)),
-                                        unshare_expr (op0), off));
-               }
-
-              return fold_binary_loc (loc, subcode,
-                                     gimple_expr_type (stmt), op0, op1);
-            }
+           /* Translate &x + CST into an invariant form suitable for
+              further propagation.  */
+           if (subcode == POINTER_PLUS_EXPR)
+             {
+               /* Handle binary operators that can appear in GIMPLE form.  */
+               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
+               tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
+
+               if (TREE_CODE (op0) == ADDR_EXPR
+                   && TREE_CODE (op1) == INTEGER_CST)
+                 {
+                   tree off = fold_convert (ptr_type_node, op1);
+                   return build_fold_addr_expr_loc
+                       (loc,
+                        fold_build2 (MEM_REF,
+                                     TREE_TYPE (TREE_TYPE (op0)),
+                                     unshare_expr (op0), off));
+                 }
+             }
+           return NULL_TREE;
 
           case GIMPLE_TERNARY_RHS:
             {
@@ -5037,20 +5035,6 @@ gimple_fold_stmt_to_constant_1 (gimple s
               tree op0 = (*valueize) (gimple_assign_rhs1 (stmt));
               tree op1 = (*valueize) (gimple_assign_rhs2 (stmt));
               tree op2 = (*valueize) (gimple_assign_rhs3 (stmt));
-
-             /* Fold embedded expressions in ternary codes.  */
-             if ((subcode == COND_EXPR
-                  || subcode == VEC_COND_EXPR)
-                 && COMPARISON_CLASS_P (op0))
-               {
-                 tree op00 = (*valueize) (TREE_OPERAND (op0, 0));
-                 tree op01 = (*valueize) (TREE_OPERAND (op0, 1));
-                 tree tem = fold_binary_loc (loc, TREE_CODE (op0),
-                                             TREE_TYPE (op0), op00, op01);
-                 if (tem)
-                   op0 = tem;
-               }
-
               return fold_ternary_loc (loc, subcode,
                                       gimple_expr_type (stmt), op0, op1, op2);
             }

Reply via email to