On Thu, 15 Feb 2024, Jakub Jelinek wrote:

> Hi!
> 
> The build_bitint_stmt_ssa_conflicts hook has a special case for
> multiplication, division and modulo, where to ensure there is no overlap
> between lhs and rhs1/rhs2 arrays we make the lhs conflict with the
> operands.
> On the following testcase, we have
>   # a_1(ab) = PHI <a_2(D)(0), a_3(ab)(3)>
> lab:
>   a_3(ab) = a_1(ab) % 3;
> before lowering and this special case causes a_3(ab) and a_1(ab) to
> conflict, but the PHI requires them not to conflict, so we ICE because we
> can't find some partitioning that will work.
> 
> The following patch fixes this by special casing such statements before
> the partitioning, force the inputs of the multiplication/division which
> have large/huge _BitInt (ab) lhs into new non-(ab) SSA_NAMEs initialized
> right before the multiplication/division.  This allows the partitioning
> to work then, as it has the possibility to use a different partition for
> the */% operands.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> 2024-02-15  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/113567
>       * gimple-lower-bitint.cc (gimple_lower_bitint): For large/huge
>       _BitInt multiplication, division or modulo with
>       SSA_NAME_OCCURS_IN_ABNORMAL_PHI lhs and at least one of rhs1 and rhs2
>       force the affected inputs into a new SSA_NAME.
> 
>       * gcc.dg/bitint-90.c: New test.
> 
> --- gcc/gimple-lower-bitint.cc.jj     2024-02-12 20:45:50.156275452 +0100
> +++ gcc/gimple-lower-bitint.cc        2024-02-14 18:17:36.630664828 +0100
> @@ -5973,6 +5973,47 @@ gimple_lower_bitint (void)
>             {
>             default:
>               break;
> +           case MULT_EXPR:
> +           case TRUNC_DIV_EXPR:
> +           case TRUNC_MOD_EXPR:
> +             if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (s))
> +               {
> +                 location_t loc = gimple_location (stmt);
> +                 gsi = gsi_for_stmt (stmt);
> +                 tree rhs1 = gimple_assign_rhs1 (stmt);
> +                 tree rhs2 = gimple_assign_rhs2 (stmt);
> +                 /* 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);
> +                   }
> +                 if (TREE_CODE (rhs2) == SSA_NAME
> +                     && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (rhs2))
> +                   {
> +                     first_large_huge = 0;
> +                     tree t = make_ssa_name (TREE_TYPE (rhs2));
> +                     g = gimple_build_assign (t, SSA_NAME, rhs2);
> +                     gsi_insert_before (&gsi, g, GSI_SAME_STMT);
> +                     gimple_set_location (g, loc);
> +                     gimple_assign_set_rhs2 (stmt, t);
> +                     update_stmt (stmt);
> +                   }
> +               }
> +             break;
>             case LROTATE_EXPR:
>             case RROTATE_EXPR:
>               {
> --- gcc/testsuite/gcc.dg/bitint-90.c.jj       2024-02-14 18:24:20.546018881 
> +0100
> +++ gcc/testsuite/gcc.dg/bitint-90.c  2024-02-14 18:24:09.900167668 +0100
> @@ -0,0 +1,23 @@
> +/* PR tree-optimization/113567 */
> +/* { dg-do compile { target bitint } } */
> +/* { dg-options "-O2" } */
> +
> +#if __BITINT_MAXWIDTH__ >= 129
> +_BitInt(129) v;
> +
> +void
> +foo (_BitInt(129) a, int i)
> +{
> +  __label__  l1, l2;
> +  i &= 1;
> +  void *p[] = { &&l1, &&l2 };
> +l1:
> +  a %= 3;
> +  v = a;
> +  i = !i;
> +  goto *(p[i]);
> +l2:;
> +}
> +#else
> +int i;
> +#endif
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH,
Frankenstrasse 146, 90461 Nuernberg, Germany;
GF: Ivo Totev, Andrew McDonald, Werner Knoblich; (HRB 36809, AG Nuernberg)

Reply via email to