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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Released by

#0  release_ssa_name_fn (fn=0x7ffff6a5f160, var=<ssa_name 0x7ffff6a8c9d8>)
    at /space/rguenther/src/svn/early-lto-debug/gcc/tree-ssanames.c:536
#1  0x00000000013735fe in release_ssa_name (name=<ssa_name 0x7ffff6a8c9d8>)
    at /space/rguenther/src/svn/early-lto-debug/gcc/tree-ssanames.h:141
#2  0x0000000001376b5c in release_defs (stmt=<gimple_call 0x7ffff6a716c0>)
    at /space/rguenther/src/svn/early-lto-debug/gcc/tree-ssanames.c:826
#3  0x00000000013f6081 in adjust_simduid_builtins (htab=0x0)
    at /space/rguenther/src/svn/early-lto-debug/gcc/tree-vectorizer.c:237
#4  0x00000000013f7a49 in vectorize_loops ()
    at /space/rguenther/src/svn/early-lto-debug/gcc/tree-vectorizer.c:839

but that doesn't clear the SCEV cache.  [I still think maintaining this
cache over pass boundaries is a ticking bomb...  we eventually should add
a verifier that walks the hashtable looking for released SSA names - but
that's not the only issue with the cache obviously!]

So here we're coming via

1416      if (!simple_iv (loop, loop_containing_stmt (stmt), lhs, iv, true))
1417        return false;

of said stmt and get at the initial SCEV via the cache which was built when
the stmt was still _14 = _21;

So a slightly more generic fix than putting a scev_reset into the vectorizer
would be

Index: gcc/tree-ssanames.c
===================================================================
--- gcc/tree-ssanames.c (revision 257139)
+++ gcc/tree-ssanames.c (working copy)
@@ -29,6 +29,8 @@ along with GCC; see the file COPYING3.
 #include "stor-layout.h"
 #include "tree-into-ssa.h"
 #include "tree-ssa.h"
+#include "cfgloop.h"
+#include "tree-scalar-evolution.h"

 /* Rewriting a function into SSA form can create a huge number of SSA_NAMEs,
    many of which may be thrown away shortly after their creation if jumps
@@ -241,6 +243,9 @@ verify_ssaname_freelists (struct functio
 void
 flush_ssaname_freelist (void)
 {
+  /* If there were any SSA names released reset the SCEV cache.  */
+  if (! vec_safe_is_empty (FREE_SSANAMES_QUEUE (cfun)))
+    scev_reset_htab ();
   vec_safe_splice (FREE_SSANAMES (cfun), FREE_SSANAMES_QUEUE (cfun));
   vec_safe_truncate (FREE_SSANAMES_QUEUE (cfun), 0);
 }

Reply via email to