On Thu, May 20, 2021 at 02:31:59PM -0500, will schmidt wrote:
> On Tue, 2021-05-18 at 16:49 -0400, Michael Meissner wrote:
> > [PATCH] Fix vec-splati-runnable.c test.
> > 
> 
> hi,
> 
> 
> > I noticed that the vec-splati-runnable.c did not have an abort after one
> > of the tests.  If the test was run with optimization, the optimizer could
> > delete some of the tests and throw off the count.
> > 
> 
> 
> > I have bootstraped this on LE power9 and BE power8 systems.  There were no
> > regressions in the tests.  Can I check this into the trunk?
> > 
> > I do not expect to back port this to GCC 11 unless we will be back porting 
> > the
> > future patches that add support for the XXSPLITW, XXSPLTIDP, and XXSPLTI32DX
> > instructions.
> > 
> > gcc/testsuite/
> > 2021-05-18  Michael Meissner  <meiss...@linux.ibm.com>
> > 
> >     * gcc.target/powerpc/vec-splati-runnable.c: Run test with -O2
> >     optimization.  Do not check what XXSPLTIDP generates if the value
> >     is undefined.
> > ---
> >  .../gcc.target/powerpc/vec-splati-runnable.c  | 29 ++++++-------------
> >  1 file changed, 9 insertions(+), 20 deletions(-)
> > 
> > diff --git a/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c 
> > b/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c
> > index e84ce77a21d..a135279b1d7 100644
> > --- a/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c
> > +++ b/gcc/testsuite/gcc.target/powerpc/vec-splati-runnable.c
> > @@ -1,7 +1,7 @@
> >  /* { dg-do run { target { power10_hw } } } */
> >  /* { dg-do link { target { ! power10_hw } } } */
> >  /* { dg-require-effective-target power10_ok } */
> > -/* { dg-options "-mdejagnu-cpu=power10 -save-temps" } */
> > +/* { dg-options "-mdejagnu-cpu=power10 -save-temps -O2" } */
> >  #include <altivec.h>
> > 
> >  #define DEBUG 0
> > @@ -12,6 +12,8 @@
> > 
> >  extern void abort (void);
> > 
> > +volatile vector double vresult_d_undefined;
> > +
> >  int
> >  main (int argc, char *argv [])
> >  {
> > @@ -85,25 +87,12 @@ main (int argc, char *argv [])
> >  #endif
> >    }
> > 
> > -  /* This test will generate a "note" to the user that the argument
> > -     is subnormal.  It is not an error, but results are not defined.  */
> > -  vresult_d = (vector double) { 2.0, 3.0 };
> > -  expected_vresult_d = (vector double) { 6.6E-42f, 6.6E-42f };
> > -
> > -  vresult_d = vec_splatid (6.6E-42f);
> > -
> > -  /* Although the instruction says the results are not defined, it does 
> > seem
> > -     to work, at least on Mambo.  But no guarentees!  */
> > -  if (!vec_all_eq (vresult_d,  expected_vresult_d)) {
> > -#if DEBUG
> > -    printf("ERROR, vec_splati (6.6E-42f)\n");
> > -    for(i = 0; i < 2; i++)
> > -      printf(" vresult_d[%i] = %e, expected_vresult_d[%i] = %e\n",
> > -        i, vresult_d[i], i, expected_vresult_d[i]);
> > -#else
> > -    ;
> > -#endif
> > -  }
> > +  /* This test will generate a "note" to the user that the argument is
> > +     subnormal.  It is not an error, but results are not defined.  Because 
> > this
> > +     is undefined, we cannot check that any value is correct.  Just store 
> > it in
> 
> as in undefined-behavior..?

It is undefined what value is put into the registers if you specify a denomral
value.

> 
> > +     a volatile variable so the XXSPLTIDP instruction gets generated and 
> > the
> > +     warning message printed. */
> > +  vresult_d_undefined = vec_splatid (6.6E-42f);
> 
> 
> This does not look like it adds an abort() call as I would have
> expected per the patch description. 

Originally the code did add an abort test.  Then I discovered the hardware
generates something different than what the simulator showed.  So I had to
remove the test for equality of what is loaded.  Sorry about that.

> 
> So this looks like it still calls vec_splatid(), but instead assigns
> result to a variable name vresult_d_undefined.   Also removes some
> DEBUG code, which is fine.  So just the vec_all_eq() call is removed?  
> I'm not certain I see how that will change the results, just the -O2
> optimization makes the difference?
> I may be missing something...

The original code was run at -O0.  If you enabled optimization, the optimizer
would delete setting the value because it did nothing.

          /* This test will generate a "note" to the user that the argument
             is subnormal.  It is not an error, but results are not defined.  */
          vresult_d = (vector double) { 2.0, 3.0 };
          expected_vresult_d = (vector double) { 6.6E-42f, 6.6E-42f };

          vresult_d = vec_splatid (6.6E-42f);

          /* Although the instruction says the results are not defined, it does 
seem
             to work, at least on Mambo.  But no guarentees!  */
          if (!vec_all_eq (vresult_d,  expected_vresult_d)) {
        #if DEBUG
            printf("ERROR, vec_splati (6.6E-42f)\n");
            for(i = 0; i < 2; i++)
              printf(" vresult_d[%i] = %e, expected_vresult_d[%i] = %e\n",
                     i, vresult_d[i], i, expected_vresult_d[i]);
        #else
            ;
        #endif
          }

This of course throws off the insn counts.  I discovered this in preparing the
next set of patches that will add XXSPLTIW, XXSPLTIDP, and XXSPLTI32DX support.

My gut feel is that the built-in should not accept those values.  But that
should be done as a separate bug report.  I don't know if anybody is using the
buil-in, and trying to load those values.

-- 
Michael Meissner, IBM
IBM, M/S 2506R, 550 King Street, Littleton, MA 01460-6245, USA
email: meiss...@linux.ibm.com, phone: +1 (978) 899-4797

Reply via email to