[PATCH] [GCC 10 branch] tree-optimization: [PR102622]: wrong code due to signed one bit integer and "a?-1:0"

Andrew Pinski pinskia@gmail.com
Mon Oct 11 21:07:09 GMT 2021


On Sun, Oct 10, 2021 at 11:41 PM Richard Biener via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> On Mon, Oct 11, 2021 at 1:20 AM apinski--- via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
> >
> > From: Andrew Pinski <apinski@marvell.com>
> >
> > So here is the GCC 10 branch version which fixes the wrong code.
> > The problem is we create a negation of an one bit signed integer type
> > which is undefined if the value was -1.
> > This is not needed for GCC 11 branch since the case is handled differently
> > there and has been fixed there (and the trunk has now been fixed too).
> > So for one bit types, there is no reason to create the negation so just
> > setting neg to false for them, just works.
> >
> > OK? Bootstrapped and tested on x86_64-linux-gnu.
>
> OK.


Applied to both the 10 branch and 9 branch.

Thanks,
Andrew

>
> Thanks,
> Richard.
>
> >         PR tree-optimization/102622
> >
> > gcc/ChangeLog:
> >
> >         * tree-ssa-phiopt.c (conditional_replacement): Set neg
> >         to false for one bit signed types.
> >
> > gcc/testsuite/ChangeLog:
> >
> >         * gcc.c-torture/execute/bitfld-10.c: New test.
> > ---
> >  gcc/testsuite/gcc.c-torture/execute/bitfld-10.c | 24 ++++++++++++++++++++++++
> >  gcc/tree-ssa-phiopt.c                           |  5 ++++-
> >  2 files changed, 28 insertions(+), 1 deletion(-)
> >  create mode 100644 gcc/testsuite/gcc.c-torture/execute/bitfld-10.c
> >
> > diff --git a/gcc/testsuite/gcc.c-torture/execute/bitfld-10.c b/gcc/testsuite/gcc.c-torture/execute/bitfld-10.c
> > new file mode 100644
> > index 0000000..bdbf573
> > --- /dev/null
> > +++ b/gcc/testsuite/gcc.c-torture/execute/bitfld-10.c
> > @@ -0,0 +1,24 @@
> > +/* PR tree-optimization/102622 */
> > +/* Wrong code introduced due to phi-opt
> > +   introducing undefined signed interger overflow
> > +   with one bit signed integer negation. */
> > +
> > +struct f{signed t:1;};
> > +int g(struct f *a, int t) __attribute__((noipa));
> > +int g(struct f *a, int t)
> > +{
> > +    if (t)
> > +      a->t = -1;
> > +    else
> > +      a->t = 0;
> > +    int t1 = a->t;
> > +    if (t1) return 1;
> > +    return t1;
> > +}
> > +
> > +int main(void)
> > +{
> > +    struct f a;
> > +    if (!g(&a, 1))  __builtin_abort();
> > +    return 0;
> > +}
> > diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
> > index 9ed26a3..a6c197d 100644
> > --- a/gcc/tree-ssa-phiopt.c
> > +++ b/gcc/tree-ssa-phiopt.c
> > @@ -770,9 +770,12 @@ conditional_replacement (basic_block cond_bb, basic_block middle_bb,
> >    if ((integer_zerop (arg0) && integer_onep (arg1))
> >        || (integer_zerop (arg1) && integer_onep (arg0)))
> >      neg = false;
> > +  /* For signed one bit types, the negation is not needed and
> > +     should be avoided and is the same as 1 case for non-signed
> > +     one bit types.  */
> >    else if ((integer_zerop (arg0) && integer_all_onesp (arg1))
> >            || (integer_zerop (arg1) && integer_all_onesp (arg0)))
> > -    neg = true;
> > +    neg = TYPE_PRECISION (TREE_TYPE (arg0)) != 1;
> >    else
> >      return false;
> >
> > --
> > 1.8.3.1
> >


More information about the Gcc-patches mailing list