As can be seen on the testcase in PR91526 the vectorizer can end
up marking things addressable because it creates very many
pointer IV.  Then unrolling can completely elide a loop or IVOPTs
can choose other IVs.  Thus it's certainly beneficial for
other passes to have an updated TREE_ADDRESSABLE, esp. NRV
which bails out on TREE_ADDRESSABLE marked vars.  Similar
tail-call wants to know this.

Not enough to fix the PR, but anyways.

Bootstrap / regtest running on x86_64-unknown-linux-gnu.

Richard.

2019-08-23  Richard Biener  <rguent...@suse.de>

        PR tree-optimization/91526
        * passes.def: Note that after late FRE we do TODO_update_address_taken.
        * tree-ssa-sccvn.c (pass_fre::execute): In late mode schedule
        TODO_update_address_taken.

Index: gcc/passes.def
===================================================================
--- gcc/passes.def      (revision 274843)
+++ gcc/passes.def      (working copy)
@@ -313,6 +313,8 @@ along with GCC; see the file COPYING3.
       NEXT_PASS (pass_split_paths);
       NEXT_PASS (pass_tracer);
       NEXT_PASS (pass_fre, false /* may_iterate */);
+      /* After late FRE we rewrite no longer addressed locals into SSA
+         form if possible.  */
       NEXT_PASS (pass_thread_jumps);
       NEXT_PASS (pass_dominator, false /* may_peel_loop_headers_p */);
       NEXT_PASS (pass_strlen);
Index: gcc/tree-ssa-sccvn.c
===================================================================
--- gcc/tree-ssa-sccvn.c        (revision 274843)
+++ gcc/tree-ssa-sccvn.c        (working copy)
@@ -7312,6 +7415,11 @@ pass_fre::execute (function *fun)
   if (iterate_p)
     loop_optimizer_finalize ();
 
+  /* For late FRE after IVOPTs and unrolling, see if we can
+     remove some TREE_ADDRESSABLE and rewrite stuff into SSA.  */
+  if (!may_iterate)
+    todo |= TODO_update_address_taken;
+
   return todo;
 }
 

Reply via email to