On Fri, 1 Dec 2023, Jakub Jelinek wrote: > Hi! > > The .{ADD,SUB}_OVERFLOW lowering is implemented by performing normal > addition/subtraction (perhaps extended to even more bits than normally by > continuing with extended values of operands after running of normal bits) > and in addition to that trying to compute if certain sets of bits are either > all zero or all sign extensions of the least significant bit. > > That code is in a lot of cases guarded just by a single condition (which > can be idx > startlimb, idx >= startlimb or idx == startlimb) or by > 2 conditions - if (idx >= startlimb) { if (idx == startlimb) ... else ... } > Now, if_then_if_then_else when the second argument is NULL works just as > if_then and sets m_gsi to be within the initially empty then block and that is > where we emit code for constant tidx startlimb + (cmp_code == GT_EXPR). > But in the 2 conditions case, m_gsi is set to the initially empty else > block, so using EQ_EXPR for the condition was incorrect (and strangely > nothing in the testsuite caught that), because the code for extracting the > lowest set of bits (i.e. when tidx is startlimb) is then done when idx > is not startlimb rather than when it is. > The following patch fixes that. > > Note, when developing the lowering, I was using gcov to make sure all code > is covered by the testsuite with minimum exceptions, so no idea how this > slipped out. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
OK. Richard. > 2023-12-01 Jakub Jelinek <ja...@redhat.com> > > PR middle-end/112750 > * gimple-lower-bitint.cc (bitint_large_huge::lower_addsub_overflow): > Use NE_EXPR rather than EQ_EXPR for g2 if !single_comparison and > adjust probabilities. > > * gcc.dg/bitint-41.c: Use -std=c23 rather than -std=c2x. > * gcc.dg/torture/bitint-43.c: Likewise. > * gcc.dg/torture/bitint-44.c: Likewise. > * gcc.dg/torture/bitint-45.c: New test. > > --- gcc/gimple-lower-bitint.cc.jj 2023-11-24 11:30:24.416427246 +0100 > +++ gcc/gimple-lower-bitint.cc 2023-11-30 10:57:40.095555940 +0100 > @@ -4028,11 +4028,11 @@ bitint_large_huge::lower_addsub_overflow > edge edge_true_true, edge_true_false, edge_false; > gimple *g2 = NULL; > if (!single_comparison) > - g2 = gimple_build_cond (EQ_EXPR, idx, > + g2 = gimple_build_cond (NE_EXPR, idx, > size_int (startlimb), NULL_TREE, > NULL_TREE); > if_then_if_then_else (g, g2, profile_probability::likely (), > - profile_probability::unlikely (), > + profile_probability::likely (), > edge_true_true, edge_true_false, > edge_false); > unsigned tidx = startlimb + (cmp_code == GT_EXPR); > --- gcc/testsuite/gcc.dg/bitint-41.c.jj 2023-11-23 12:59:48.027443972 > +0100 > +++ gcc/testsuite/gcc.dg/bitint-41.c 2023-11-30 11:05:54.956550967 +0100 > @@ -1,6 +1,6 @@ > /* PR middle-end/112336 */ > /* { dg-do compile { target bitint } } */ > -/* { dg-options "-std=c2x" } */ > +/* { dg-options "-std=c23" } */ > > unsigned _BitInt(1) v1; > unsigned _BitInt(1) *p1 = &v1; > --- gcc/testsuite/gcc.dg/torture/bitint-43.c.jj 2023-11-20 > 09:49:35.236668167 +0100 > +++ gcc/testsuite/gcc.dg/torture/bitint-43.c 2023-11-30 11:06:31.840028866 > +0100 > @@ -1,6 +1,6 @@ > /* PR c/111309 */ > /* { dg-do run { target bitint } } */ > -/* { dg-options "-std=c2x -pedantic-errors" } */ > +/* { dg-options "-std=c23 -pedantic-errors" } */ > /* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ > /* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ > > --- gcc/testsuite/gcc.dg/torture/bitint-44.c.jj 2023-11-14 > 10:52:16.192276014 +0100 > +++ gcc/testsuite/gcc.dg/torture/bitint-44.c 2023-11-30 11:06:37.494948817 > +0100 > @@ -1,6 +1,6 @@ > /* PR c/111309 */ > /* { dg-do run { target bitint } } */ > -/* { dg-options "-std=c2x -pedantic-errors" } */ > +/* { dg-options "-std=c23 -pedantic-errors" } */ > /* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ > /* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ > > --- gcc/testsuite/gcc.dg/torture/bitint-45.c.jj 2023-11-30 > 11:07:40.778053018 +0100 > +++ gcc/testsuite/gcc.dg/torture/bitint-45.c 2023-11-30 11:07:19.294357123 > +0100 > @@ -0,0 +1,32 @@ > +/* PR middle-end/112750 */ > +/* { dg-do run { target bitint } } */ > +/* { dg-options "-std=c23 -pedantic-errors" } */ > +/* { dg-skip-if "" { ! run_expensive_tests } { "*" } { "-O0" "-O2" } } */ > +/* { dg-skip-if "" { ! run_expensive_tests } { "-flto" } { "" } } */ > + > +#if __BITINT_MAXWIDTH__ >= 256 > +_BitInt(256) a = __INT_MAX__ + (_BitInt(256)) 1; > +_BitInt(256) b = __INT_MAX__; > +#endif > +#if __BITINT_MAXWIDTH__ >= 512 > +_BitInt(512) c = 0x7fffffffffffffffffffffffffffffffffffffffwb + > (_BitInt(512)) 1; > +_BitInt(512) d = 0x7fffffffffffffffffffffffffffffffffffffffwb; > +#endif > + > +int > +main () > +{ > +#if __BITINT_MAXWIDTH__ >= 256 > + if (!__builtin_sub_overflow_p (a, 0, 0)) > + __builtin_abort (); > + if (!__builtin_sub_overflow_p (b, -1, 0)) > + __builtin_abort (); > +#endif > +#if __BITINT_MAXWIDTH__ >= 512 > + if (!__builtin_sub_overflow_p (c, 0, (_BitInt(160)) 0)) > + __builtin_abort (); > + if (!__builtin_sub_overflow_p (d, -1, 0)) > + __builtin_abort (); > +#endif > + return 0; > +} > > 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)