aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorAlexandre Oliva <oliva@adacore.com>2024-11-07 02:47:46 -0300
committerAlexandre Oliva <oliva@gnu.org>2024-11-07 02:47:46 -0300
commit13cf22eb557eb5e3d796822247d8d4957bdb25da (patch)
tree58536a032083d5936caa5de60a0bb407e84dac93 /gcc
parentae074c69fd5aff10953264dbd9740cebfeb0902e (diff)
downloadgcc-13cf22eb557eb5e3d796822247d8d4957bdb25da.zip
gcc-13cf22eb557eb5e3d796822247d8d4957bdb25da.tar.gz
gcc-13cf22eb557eb5e3d796822247d8d4957bdb25da.tar.bz2
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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/tree-ssa-ifcombine.cc11
1 files changed, 11 insertions, 0 deletions
diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
index 158f2a6..d52510e 100644
--- a/gcc/tree-ssa-ifcombine.cc
+++ b/gcc/tree-ssa-ifcombine.cc
@@ -519,6 +519,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;