]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
range-cache: Fix ICE on SSA_NAME with def_stmt not yet in the IL [PR116898]
authorJakub Jelinek <jakub@redhat.com>
Tue, 1 Oct 2024 07:49:49 +0000 (09:49 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 1 Oct 2024 07:49:49 +0000 (09:49 +0200)
Some passes like the bitint lowering queue some statements on edges and only
commit them at the end of the pass.  If they use ranger at the same time,
the ranger might see such SSA_NAMEs and ICE on those.  The following patch
instead just punts on them.

2024-10-01  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/116898
* gimple-range-cache.cc (ranger_cache::block_range): If a SSA_NAME
with NULL def_bb isn't SSA_NAME_IS_DEFAULT_DEF, return false instead
of failing assertion.  Formatting fix.

* gcc.dg/bitint-110.c: New test.

gcc/gimple-range-cache.cc
gcc/testsuite/gcc.dg/bitint-110.c [new file with mode: 0644]

index 43949894cbed84394317fd262fa994d14da48bdc..c0b8916e85af2a54b000bae4b84f596e0cd4e64b 100644 (file)
@@ -1284,13 +1284,16 @@ ranger_cache::block_range (vrange &r, basic_block bb, tree name, bool calc)
       gimple *def_stmt = SSA_NAME_DEF_STMT (name);
       basic_block def_bb = NULL;
       if (def_stmt)
-       def_bb = gimple_bb (def_stmt);;
+       def_bb = gimple_bb (def_stmt);
       if (!def_bb)
        {
          // If we get to the entry block, this better be a default def
          // or range_on_entry was called for a block not dominated by
-         // the def.  
-         gcc_checking_assert (SSA_NAME_IS_DEFAULT_DEF (name));
+         // the def.  But it could be also SSA_NAME defined by a statement
+         // not yet in the IL (such as queued edge insertion), in that case
+         // just punt.
+         if (!SSA_NAME_IS_DEFAULT_DEF (name))
+           return false;
          def_bb = ENTRY_BLOCK_PTR_FOR_FN (cfun);
        }
 
diff --git a/gcc/testsuite/gcc.dg/bitint-110.c b/gcc/testsuite/gcc.dg/bitint-110.c
new file mode 100644 (file)
index 0000000..4ba2f93
--- /dev/null
@@ -0,0 +1,20 @@
+/* PR middle-end/116898 */
+/* { dg-do compile { target bitint575 } } */
+/* { dg-options "-O -finstrument-functions -fnon-call-exceptions" } */
+
+_BitInt(127) a;
+_BitInt(511) b;
+
+void
+foo (_BitInt(31) c)
+{
+  do
+    {
+      c %= b;
+again:
+    }
+  while (c);
+  a /= 0;              /* { dg-warning "division by zero" } */
+  c -= a;
+  goto again;
+}