[Bug middle-end/106408] PRE with infinite loops

rguenther at suse dot de gcc-bugzilla@gcc.gnu.org
Fri Jul 22 11:49:22 GMT 2022


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106408

--- Comment #3 from rguenther at suse dot de <rguenther at suse dot de> ---
On Fri, 22 Jul 2022, hubicka at ucw dot cz wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=106408
> 
> --- Comment #2 from Jan Hubicka <hubicka at ucw dot cz> ---
> > +      /* If block is a loop that is possibly infinite we should not
> > +        hoist across it.  */
> > +      if (block->loop_father->header == block
> > +         && !finite_loop_p (block->loop_father))
> > +       BB_MAY_NOTRETURN (block) = 1;
> > +
> Don't you just need to handle also BBs that have backedge out that is
> not a latch of loop?

I would need to handle all blocks with an incoming backedge,
and for non-irreducible regions can use finite_loop_p, yes.
Not sure what you mean with backedge out.

So the following would handle loops and irreducible regions correctly
I think.

diff --git a/gcc/tree-ssa-pre.cc b/gcc/tree-ssa-pre.cc
index e029bd36da3..a2d8b52f872 100644
--- a/gcc/tree-ssa-pre.cc
+++ b/gcc/tree-ssa-pre.cc
@@ -52,6 +52,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "tree-cfgcleanup.h"
 #include "alias.h"
 #include "gimple-range.h"
+#include "tree-ssa-loop-niter.h"

 /* Even though this file is called tree-ssa-pre.cc, we actually
    implement a bit more than just PRE here.  All of them piggy-back
@@ -3939,6 +3940,16 @@ compute_avail (function *fun)

       BB_MAY_NOTRETURN (block) = 0;

+      /* If this block is an entry into a CFG cycle that is possibly 
infinite
+        we should not hoist across it.  */
+      edge_iterator ei;
+      edge e;
+      FOR_EACH_EDGE (e, ei, block->preds)
+       if ((e->flags & EDGE_DFS_BACK)
+           && (block->loop_father->header != block
+               || !finite_loop_p (block->loop_father)))
+         BB_MAY_NOTRETURN (block) = 1;
+
       /* Now compute value numbers and populate value sets with all
         the expressions computed in BLOCK.  */
       bool set_bb_may_notreturn = false;


More information about the Gcc-bugs mailing list