On Mon, 2 Sep 2024, Jakub Jelinek wrote: > Hi! > > The following testcase is miscompiled. The problem is in the last_ovf step. > The second operand has signed _BitInt(513) type but has the MSB clear, > so range_to_prec returns 512 for it (i.e. it fits into unsigned > _BitInt(512)). Because of that the last step actually doesn't need to get > the most significant bit from the second operand, but the code was deciding > what to use purely from TYPE_UNSIGNED (type1) - if unsigned, use 0, > otherwise sign-extend the last processed bit; but that in this case was set. > We don't want to treat the positive operand as if it was negative regardless > of the bit below that precision, and precN >= 0 indicates that the operand > is in the [0, inf) range. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK > 2024-09-02 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/116501 > * gimple-lower-bitint.cc (bitint_large_huge::lower_addsub_overflow): > In the last_ovf case, use build_zero_cst operand not just when > TYPE_UNSIGNED (typeN), but also when precN >= 0. > > * gcc.dg/torture/bitint-73.c: New test. > > --- gcc/gimple-lower-bitint.cc.jj 2024-07-17 23:36:01.264307447 +0200 > +++ gcc/gimple-lower-bitint.cc 2024-09-02 15:17:30.347950715 +0200 > @@ -4192,7 +4192,7 @@ bitint_large_huge::lower_addsub_overflow > else > { > m_data_cnt = data_cnt; > - if (TYPE_UNSIGNED (type0)) > + if (TYPE_UNSIGNED (type0) || prec0 >= 0) > rhs1 = build_zero_cst (m_limb_type); > else > { > @@ -4210,7 +4210,7 @@ bitint_large_huge::lower_addsub_overflow > rhs1 = add_cast (m_limb_type, gimple_assign_lhs (g)); > } > } > - if (TYPE_UNSIGNED (type1)) > + if (TYPE_UNSIGNED (type1) || prec1 >= 0) > rhs2 = build_zero_cst (m_limb_type); > else > { > --- gcc/testsuite/gcc.dg/torture/bitint-73.c.jj 2024-09-02 > 15:19:00.220782186 +0200 > +++ gcc/testsuite/gcc.dg/torture/bitint-73.c 2024-09-02 15:20:43.222442952 > +0200 > @@ -0,0 +1,20 @@ > +/* PR tree-optimization/116501 */ > +/* { dg-do run { target bitint575 } } */ > +/* { dg-options "-std=c23" } */ > +/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ > +/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ > + > +_BitInt (4) a; > + > +int > +foo (_BitInt(513) b) > +{ > + return __builtin_sub_overflow_p (a, b, (_BitInt (511)) 0); > +} > + > +int > +main () > +{ > + if (!foo > (0xffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000ffffffffffffffff0000000000000000wb)) > + __builtin_abort (); > +} > > 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)