diff options
author | Alexandre Oliva <oliva@adacore.com> | 2024-11-07 02:47:46 -0300 |
---|---|---|
committer | Alexandre Oliva <oliva@gnu.org> | 2024-11-07 02:47:46 -0300 |
commit | 13cf22eb557eb5e3d796822247d8d4957bdb25da (patch) | |
tree | 58536a032083d5936caa5de60a0bb407e84dac93 /gcc | |
parent | ae074c69fd5aff10953264dbd9740cebfeb0902e (diff) | |
download | gcc-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.cc | 11 |
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; |