When everything else fails, if enabled by the target or by a
parameter, and when other requirements are satisfied, ifcombine
generates an AND of both conditions.

That may be good for contiguous conditions, but it's unlikely to be an
optimization when the blocks are separate.

Add contiguity to the set of requirements for this fallback
transformation.

Regstrapped on x86_64-linux-gnu.  Ok to install?


for  gcc/ChangeLog

        * tree-ssa-ifcombine.cc (ifcombine_ifandif): Avoid fallback
        conjunction of noncontiguous conditions.
---
 gcc/tree-ssa-ifcombine.cc |    4 ++++
 1 file changed, 4 insertions(+)

diff --git a/gcc/tree-ssa-ifcombine.cc b/gcc/tree-ssa-ifcombine.cc
index 9b9dc10cd2202..51f37f15a9efc 100644
--- a/gcc/tree-ssa-ifcombine.cc
+++ b/gcc/tree-ssa-ifcombine.cc
@@ -974,6 +974,10 @@ ifcombine_ifandif (basic_block inner_cond_bb, bool 
inner_inv,
                                            gimple_cond_rhs (outer_cond),
                                            gimple_bb (outer_cond))))
        {
+         /* Only combine conditions in this fallback case if the blocks are
+            neighbors.  */
+         if (single_pred (inner_cond_bb) != outer_cond_bb)
+           return false;
          tree t1, t2;
          bool logical_op_non_short_circuit = LOGICAL_OP_NON_SHORT_CIRCUIT;
          if (param_logical_op_non_short_circuit != -1)


-- 
Alexandre Oliva, happy hacker            https://FSFLA.org/blogs/lxo/
   Free Software Activist                   GNU Toolchain Engineer
More tolerance and less prejudice are key for inclusion and diversity
Excluding neuro-others for not behaving ""normal"" is *not* inclusive

Reply via email to