]> git.ipfire.org Git - thirdparty/gcc.git/commit
bitintlower: Fix _BitInt SSA_NAME coalescing ICE [PR126447]
authorJakub Jelinek <jakub@redhat.com>
Wed, 29 Jul 2026 08:04:30 +0000 (10:04 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 29 Jul 2026 08:04:30 +0000 (10:04 +0200)
commitcd9428362b6585e77ea2a171ec030894fcfa4d1c
tree85e9e1d4fd705bf8509fb6a40ba57131e2607f14
parente584ae9446b47bf3a06183ebedc4f2ffc53fa02c
bitintlower: Fix _BitInt SSA_NAME coalescing ICE [PR126447]

The following testcases ICE, because the build_bitint_stmt_ssa_conflicts
function sets for those ifns muldiv_p to true (similarly to the MULT_EXPR
and division/modulo ones) to prevent the lhs from being mapped into
the same underlying variable as the input operand(s).
Now, if the lhs and at least one of the operands
SSA_NAME_OCCURS_IN_ABNORMAL_PHI, we can trigger ICE because we fail to
coalesce something that has to be coalesced.
For MULT_EXPR etc. we handle this in gimple_lower_bitint, by
                    /* For multiplication and division with (ab)
                       lhs and one or both operands force the operands
                       into new SSA_NAMEs to avoid coalescing failures.  */
                    if (TREE_CODE (rhs1) == SSA_NAME
                        && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs1))
                      {
                        first_large_huge = 0;
                        tree t = make_ssa_name (TREE_TYPE (rhs1));
                        g = gimple_build_assign (t, SSA_NAME, rhs1);
                        gsi_insert_before (&gsi, g, GSI_SAME_STMT);
                        gimple_set_location (g, loc);
                        gimple_assign_set_rhs1 (stmt, t);
                        if (rhs1 == rhs2)
                          {
                            gimple_assign_set_rhs2 (stmt, t);
                            rhs2 = t;
                          }
                        update_stmt (stmt);
                      }
etc. a few lines above the hunk below.
This patch just adds the same thing for the problematic internal
fn calls (not handling that way the .MUL_OVERFLOW etc. ifns,
because those do return COMPLEX_EXPR of BITINT_TYPE and so the
problematic case shouldn't exist there).

2026-07-29  Jakub Jelinek  <jakub@redhat.com>

PR middle-end/126447
* gimple-lower-bitint.cc (gimple_lower_bitint): For
ifn calls with large/huge _BitInt (ab) SSA_NAME lhs if they
have such (ab) argument too, force it into temporary SSA_NAME
for IFN_BSWAP, IFN_BITREVERSE, IFN_UBSAN_CHECK_MUL and, if
bitint_big_endian, also for IFN_UBSAN_CHECK_{ADD,SUB}.

* gcc.dg/ubsan/bitint-5.c: New test.
* gcc.dg/bitint-138.c: New test.

Reviewed-by: Andrea Pinski <andrew.pinski@oss.qualcomm.com>
gcc/gimple-lower-bitint.cc
gcc/testsuite/gcc.dg/bitint-138.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/ubsan/bitint-5.c [new file with mode: 0644]