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?

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.

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

Reply via email to