https://gcc.gnu.org/g:e731ae8c98953fb898a938ee0a0be19e2ea906d7

commit e731ae8c98953fb898a938ee0a0be19e2ea906d7
Author: Alexandre Oliva <ol...@gnu.org>
Date:   Fri Sep 13 21:43:10 2024 -0300

    fold truth-and only in ifcombine

Diff:
---
 gcc/gimple-fold.cc        |  2 ++
 gcc/tree-ssa-ifcombine.cc | 24 +++++++++++++++++++++---
 2 files changed, 23 insertions(+), 3 deletions(-)

diff --git a/gcc/gimple-fold.cc b/gcc/gimple-fold.cc
index 85a0ec028030..5b7d83edbea9 100644
--- a/gcc/gimple-fold.cc
+++ b/gcc/gimple-fold.cc
@@ -8738,12 +8738,14 @@ maybe_fold_and_comparisons (tree type,
                                                     op2b, outer_cond_bb))
     return t;
 
+#if 0
   if (tree t = fold_truth_andor_maybe_separate (UNKNOWN_LOCATION,
                                                TRUTH_ANDIF_EXPR, type,
                                                code2, op2a, op2b,
                                                code1, op1a, op1b,
                                                NULL))
     return t;
+#endif
 
   return NULL_TREE;
 }
diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
index 79a4bdd363b9..61480e5fa894 100644
--- a/gcc/tree-ssa-ifcombine.cc
+++ b/gcc/tree-ssa-ifcombine.cc
@@ -399,6 +399,14 @@ update_profile_after_ifcombine (basic_block inner_cond_bb,
   outer2->probability = profile_probability::never ();
 }
 
+/* FIXME: move to a header file.  */
+extern tree
+fold_truth_andor_maybe_separate (location_t loc,
+                                enum tree_code code, tree truth_type,
+                                enum tree_code lcode, tree ll_arg, tree lr_arg,
+                                enum tree_code rcode, tree rl_arg, tree rr_arg,
+                                tree *separatep);
+
 /* If-convert on a and pattern with a common else block.  The inner
    if is specified by its INNER_COND_BB, the outer by OUTER_COND_BB.
    inner_inv, outer_inv and result_inv indicate whether the conditions
@@ -576,7 +584,7 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool 
inner_inv,
   else if (TREE_CODE_CLASS (gimple_cond_code (inner_cond)) == tcc_comparison
           && TREE_CODE_CLASS (gimple_cond_code (outer_cond)) == tcc_comparison)
     {
-      tree t;
+      tree t, ts = NULL_TREE;
       enum tree_code inner_cond_code = gimple_cond_code (inner_cond);
       enum tree_code outer_cond_code = gimple_cond_code (outer_cond);
 
@@ -599,7 +607,17 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool 
inner_inv,
                                            outer_cond_code,
                                            gimple_cond_lhs (outer_cond),
                                            gimple_cond_rhs (outer_cond),
-                                           gimple_bb (outer_cond))))
+                                           gimple_bb (outer_cond)))
+         && !(t = ts = (fold_truth_andor_maybe_separate
+                        (UNKNOWN_LOCATION, TRUTH_ANDIF_EXPR,
+                         boolean_type_node,
+                         outer_cond_code,
+                         gimple_cond_lhs (outer_cond),
+                         gimple_cond_rhs (outer_cond),
+                         inner_cond_code,
+                         gimple_cond_lhs (inner_cond),
+                         gimple_cond_rhs (inner_cond),
+                         NULL))))
        {
          {
          tree t1, t2;
@@ -636,7 +654,7 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool 
inner_inv,
                                          NULL, true, GSI_SAME_STMT);
         }
       /* ??? Fold should avoid this.  */
-      else if (!is_gimple_condexpr_for_cond (t))
+      else if (ts && !is_gimple_condexpr_for_cond (t))
        goto gimplify_after_fold;
       if (result_inv)
        t = fold_build1 (TRUTH_NOT_EXPR, TREE_TYPE (t), t);

Reply via email to