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)