Hi! Similar problem to calls with uninitialized large/huge _BitInt SSA_NAME arguments, var_to_partition will not work for those, but unlike calls where we just create a new uninitialized SSA_NAME here we need to change the inline asm input to be an uninitialized VAR_DECL.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? 2024-02-02 Jakub Jelinek <ja...@redhat.com> PR middle-end/113699 * gimple-lower-bitint.cc (bitint_large_huge::lower_asm): Handle uninitialized large/huge _BitInt SSA_NAME inputs. * gcc.dg/bitint-81.c: New test. --- gcc/gimple-lower-bitint.cc.jj 2024-01-31 10:55:42.677095630 +0100 +++ gcc/gimple-lower-bitint.cc 2024-02-01 10:36:08.408867602 +0100 @@ -5200,9 +5200,18 @@ bitint_large_huge::lower_asm (gimple *st && TREE_CODE (TREE_TYPE (s)) == BITINT_TYPE && bitint_precision_kind (TREE_TYPE (s)) >= bitint_prec_large) { - int part = var_to_partition (m_map, s); - gcc_assert (m_vars[part] != NULL_TREE); - TREE_VALUE (t) = m_vars[part]; + if (SSA_NAME_IS_DEFAULT_DEF (s) + && (!SSA_NAME_VAR (s) || VAR_P (SSA_NAME_VAR (s)))) + { + TREE_VALUE (t) = create_tmp_var (TREE_TYPE (s), "bitint"); + mark_addressable (TREE_VALUE (t)); + } + else + { + int part = var_to_partition (m_map, s); + gcc_assert (m_vars[part] != NULL_TREE); + TREE_VALUE (t) = m_vars[part]; + } } } update_stmt (stmt); --- gcc/testsuite/gcc.dg/bitint-81.c.jj 2024-02-01 10:38:26.132937531 +0100 +++ gcc/testsuite/gcc.dg/bitint-81.c 2024-02-01 10:38:01.628280939 +0100 @@ -0,0 +1,12 @@ +/* PR middle-end/113699 */ +/* { dg-do compile { target bitint } } */ +/* { dg-options "-O2 -std=c23" } */ + +void +foo (void) +{ +#if __BITINT_MAXWIDTH__ >= 129 + _BitInt(129) i; + __asm__ ("" : : "rm" (i)); +#endif +} Jakub