Hi!

torture/bitint-39.c ICEs with -O1; the problem is that the
finish_arith_overflow code in one spot replaces use_stmt with an
assignment or cast, but if unlucky and m_gsi iterator is the same statement,
when the code later
      tree clobber = build_clobber (TREE_TYPE (var), CLOBBER_EOL);
      g = gimple_build_assign (var, clobber);
      gsi_insert_after (&m_gsi, g, GSI_SAME_STMT);
it will insert after iterator which contains already replaced statement and
that causes the gimple chain corruption.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok
for trunk?

2023-12-01  Jakub Jelinek  <ja...@redhat.com>

        * gimple-lower-bitint.cc (bitint_large_huge::finish_arith_overflow):
        When replacing use_stmt which is gsi_stmt (m_gsi), update m_gsi to
        the new statement.

--- gcc/gimple-lower-bitint.cc.jj       2023-11-30 10:57:40.095555940 +0100
+++ gcc/gimple-lower-bitint.cc  2023-11-30 12:46:34.715093396 +0100
@@ -3682,6 +3682,8 @@ bitint_large_huge::finish_arith_overflow
              else
                g = gimple_build_assign (lhs2, NOP_EXPR, ovf);
              gsi_replace (&gsi, g, true);
+             if (gsi_stmt (m_gsi) == use_stmt)
+               m_gsi = gsi_for_stmt (g);
              break;
            }
        }

        Jakub

Reply via email to