On Mon, 6 Sep 2021, Hongtao Liu wrote:

> On Mon, Sep 6, 2021 at 6:03 PM Richard Biener via Gcc-patches
> <gcc-patches@gcc.gnu.org> wrote:
> >
> > On Mon, 6 Sep 2021, liuhongt wrote:
> >
> > > Hi:
> > >   For the conversion from _Float16 to int, if the corresponding optab
> > > does not exist, the compiler will try the wider mode (SFmode here),
> > > but when floatsfsi exists but FAIL, FROM will be rewritten, which
> > > leads to a PR runtime error.
> > >
> > >   Boostrapped and regtested on x86_64-linux-gnu{-m32,}.
> > >   Ok for trunk?
> > >
> > > gcc/ChangeLog:
> > >
> > >       PR middle-end/102182
> > >       * optabs.c (expand_fix): Add from1 to avoid from being
> > >       overwritten.
> > >
> > > gcc/testsuite/ChangeLog:
> > >
> > >       PR middle-end/102182
> > >       *gcc.target/i386/pr101282.c: New test.
> > > ---
> > >  gcc/optabs.c                             | 10 +++++++---
> > >  gcc/testsuite/gcc.target/i386/pr101282.c | 18 ++++++++++++++++++
> > >  2 files changed, 25 insertions(+), 3 deletions(-)
> > >  create mode 100644 gcc/testsuite/gcc.target/i386/pr101282.c
> > >
> > > diff --git a/gcc/optabs.c b/gcc/optabs.c
> > > index ebed78fda3f..6af67d05253 100644
> > > --- a/gcc/optabs.c
> > > +++ b/gcc/optabs.c
> > > @@ -5480,6 +5480,7 @@ expand_fix (rtx to, rtx from, int unsignedp)
> > >      FOR_EACH_MODE_FROM (imode, GET_MODE (to))
> > >        {
> > >       int doing_unsigned = unsignedp;
> > > +     rtx from1 = NULL_RTX;
> > >
> > >       icode = can_fix_p (imode, fmode, unsignedp, &must_trunc);
> > >       if (icode == CODE_FOR_nothing && imode != GET_MODE (to) && 
> > > unsignedp)
> > > @@ -5489,19 +5490,22 @@ expand_fix (rtx to, rtx from, int unsignedp)
> > >         {
> > >           rtx_insn *last = get_last_insn ();
> >
> > better declare from1 here
> Changed.
> >
> > >           if (fmode != GET_MODE (from))
> > > -           from = convert_to_mode (fmode, from, 0);
> > > +           from1 = convert_to_mode (fmode, from, 0);
> > >
> > >           if (must_trunc)
> > >             {
> > >               rtx temp = gen_reg_rtx (GET_MODE (from));
> > > -             from = expand_unop (GET_MODE (from), ftrunc_optab, from,
> > > +             from1 = expand_unop (GET_MODE (from), ftrunc_optab, from,
> >
> > this must use from1 as well?
> Oh, yes!
> >
> > >                                   temp, 0);
> > >             }
> > >
> > >           if (imode != GET_MODE (to))
> > >             target = gen_reg_rtx (imode);
> > >
> > > -         if (maybe_emit_unop_insn (icode, target, from,
> > > +         if (!from1)
> > > +           from1 = from;
> >
> > so move this up.
> >
> > > +         if (maybe_emit_unop_insn (icode, target, from1,
> > >                                     doing_unsigned ? UNSIGNED_FIX : FIX))
> > >             {
> > >               if (target != to)
> > > diff --git a/gcc/testsuite/gcc.target/i386/pr101282.c 
> > > b/gcc/testsuite/gcc.target/i386/pr101282.c
> > > new file mode 100644
> > > index 00000000000..2148b9294ef
> > > --- /dev/null
> > > +++ b/gcc/testsuite/gcc.target/i386/pr101282.c
> > > @@ -0,0 +1,18 @@
> > > +/* { dg-do run { target { ia32 } } } */
> > > +/* { dg-options "-Os -march=i686 -mfpmath=sse -msse2" } */
> > > +
> > > +#include<stdlib.h>
> > > +int
> > > +main (void)
> > > +{
> > > +  static volatile unsigned int ivin, ivout;
> > > +  static volatile _Float16 fv1, fv2;
> > > +  ivin = ((unsigned int)1);
> > > +  fv1 = ((unsigned int)1);
> > > +  fv2 = ivin;
> > > +  ivout = fv2;
> > > +  if (ivout != ((unsigned int)1))
> > > +    abort ();
> > > +
> > > +  exit (0);
> > > +}
> > >
> >
> > --
> > Richard Biener <rguent...@suse.de>
> > SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
> > Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
> 
> 
> Here is the update patch.

OK.

Thanks,
Richard.

Reply via email to