https://gcc.gnu.org/g:0902a711b665a66a7ce813f00fa26ab8a534581e

commit 0902a711b665a66a7ce813f00fa26ab8a534581e
Author: Alexandre Oliva <ol...@adacore.com>
Date:   Thu Oct 24 15:35:40 2024 -0300

    handle TRUTH_ANDIF cond exprs in ifcombine_replace_cond
    
    The upcoming move of fold_truth_andor to ifcombine brings with it the
    possibility of TRUTH_ANDIF cond exprs.  Handle them by splitting the
    cond so as to best use both BB insertion points, but only if they're
    contiguous.
    
    
    for  gcc/ChangeLog
    
            * tree-ssa-ifcombine.c (ifcombine_replace_cond): Support
            TRUTH_ANDIF cond exprs.

Diff:
---
 gcc/tree-ssa-ifcombine.cc | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
index b791bc0155c2..ac4811e42e08 100644
--- a/gcc/tree-ssa-ifcombine.cc
+++ b/gcc/tree-ssa-ifcombine.cc
@@ -518,6 +518,17 @@ ifcombine_replace_cond (gcond *inner_cond, bool inner_inv,
                        gcond *outer_cond, bool outer_inv,
                        tree cond, bool must_canon, tree cond2)
 {
+  /* Split cond into cond2 if they're contiguous.  ??? We might be able to
+     handle ORIF as well, inverting both conditions, but it's not clear that
+     this would be enough, and it never comes up.  */
+  if (!cond2
+      && TREE_CODE (cond) == TRUTH_ANDIF_EXPR
+      && single_pred (gimple_bb (inner_cond)) == gimple_bb (outer_cond))
+    {
+      cond2 = TREE_OPERAND (cond, 1);
+      cond = TREE_OPERAND (cond, 0);
+    }
+
   bool outer_p = cond2 || (single_pred (gimple_bb (inner_cond))
                           != gimple_bb (outer_cond));
   bool result_inv = outer_p ? outer_inv : inner_inv;

Reply via email to