On Tue, 19 Nov 2024, Jakub Jelinek wrote:

> Hi!
> 
> r15-4601 added match.pd simplification of some TRUNC_DIV_EXPR expressions
> into EXACT_DIV_EXPR, so bitintlower can now encounter even those.
> From bitint lowering POV the fact that the division will be exact
> doesn't matter, we still need to call at runtime the __divmodbitint4
> API and it wouldn't simplify there anything to know it is exact if
> we duplicated that, so the following patch lowers EXACT_DIV_EXPR exactly
> as TRUNC_DIV_EXPR.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK.

> I think we don't need to backport this unless something introduces
> EXACT_DIV_EXPR on BITINT_TYPEd expressions on the 14 branch as well.

Agreed.

Richard.

> 2024-11-19  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR middle-end/117571
>       * gimple-lower-bitint.cc (bitint_large_huge::lower_muldiv_stmt,
>       bitint_large_huge::lower_stmt, stmt_needs_operand_addr,
>       build_bitint_stmt_ssa_conflicts, gimple_lower_bitint): Handle
>       EXACT_DIV_EXPR like TRUNC_DIV_EXPR.
> 
>       * gcc.dg/bitint-114.c: New test.
> 
> --- gcc/gimple-lower-bitint.cc.jj     2024-10-24 18:53:39.263072751 +0200
> +++ gcc/gimple-lower-bitint.cc        2024-11-18 15:37:35.344738882 +0100
> @@ -3597,6 +3597,7 @@ bitint_large_huge::lower_muldiv_stmt (tr
>        insert_before (g);
>        break;
>      case TRUNC_DIV_EXPR:
> +    case EXACT_DIV_EXPR:
>        g = gimple_build_call_internal (IFN_DIVMODBITINT, 8,
>                                     lhs, build_int_cst (sitype, prec),
>                                     null_pointer_node,
> @@ -5560,6 +5561,7 @@ bitint_large_huge::lower_stmt (gimple *s
>               return;
>             case MULT_EXPR:
>             case TRUNC_DIV_EXPR:
> +           case EXACT_DIV_EXPR:
>             case TRUNC_MOD_EXPR:
>               lower_muldiv_stmt (lhs, g);
>               goto handled;
> @@ -5694,6 +5696,7 @@ bitint_large_huge::lower_stmt (gimple *s
>       return;
>        case MULT_EXPR:
>        case TRUNC_DIV_EXPR:
> +      case EXACT_DIV_EXPR:
>        case TRUNC_MOD_EXPR:
>       lower_muldiv_stmt (NULL_TREE, stmt);
>       return;
> @@ -5740,6 +5743,7 @@ stmt_needs_operand_addr (gimple *stmt)
>        {
>        case MULT_EXPR:
>        case TRUNC_DIV_EXPR:
> +      case EXACT_DIV_EXPR:
>        case TRUNC_MOD_EXPR:
>        case FLOAT_EXPR:
>       return true;
> @@ -5931,6 +5935,7 @@ build_bitint_stmt_ssa_conflicts (gimple
>               {
>               case MULT_EXPR:
>               case TRUNC_DIV_EXPR:
> +             case EXACT_DIV_EXPR:
>               case TRUNC_MOD_EXPR:
>                 muldiv_p = true;
>               default:
> @@ -6174,6 +6179,7 @@ gimple_lower_bitint (void)
>               break;
>             case MULT_EXPR:
>             case TRUNC_DIV_EXPR:
> +           case EXACT_DIV_EXPR:
>             case TRUNC_MOD_EXPR:
>               if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (s))
>                 {
> @@ -6455,6 +6461,7 @@ gimple_lower_bitint (void)
>                       switch (gimple_assign_rhs_code (use_stmt))
>                         {
>                         case TRUNC_DIV_EXPR:
> +                       case EXACT_DIV_EXPR:
>                         case TRUNC_MOD_EXPR:
>                         case FLOAT_EXPR:
>                           /* For division, modulo and casts to floating
> @@ -6568,6 +6575,7 @@ gimple_lower_bitint (void)
>                 case RSHIFT_EXPR:
>                 case MULT_EXPR:
>                 case TRUNC_DIV_EXPR:
> +               case EXACT_DIV_EXPR:
>                 case TRUNC_MOD_EXPR:
>                 case FIX_TRUNC_EXPR:
>                 case REALPART_EXPR:
> --- gcc/testsuite/gcc.dg/bitint-114.c.jj      2024-11-18 15:35:20.374624506 
> +0100
> +++ gcc/testsuite/gcc.dg/bitint-114.c 2024-11-18 15:35:55.651131671 +0100
> @@ -0,0 +1,23 @@
> +/* PR middle-end/117571 */
> +/* { dg-do compile { target bitint } } */
> +/* { dg-options "-O2" } */
> +
> +#if __BITINT_MAXWIDTH__ >= 255
> +_BitInt(255) b;
> +
> +_BitInt(255)
> +foo ()
> +{
> +  return (b << 10) / 2;
> +}
> +#endif
> +
> +#if __BITINT_MAXWIDTH__ >= 8192
> +_BitInt(8192) c;
> +
> +_BitInt(8192)
> +bar ()
> +{
> +  return (c << 1039) / 
> 0x20000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000wb;
> +}
> +#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