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

Reply via email to