On Fri, Feb 28, 2025 at 9:40 AM Jakub Jelinek <ja...@redhat.com> wrote:
>
> Hi!
>
> The testcase uses -m32 in dg-options, something we try hard not to do,
> if something should be tested only for -m32, it is { target ia32 } test,
> if it can be tested for -m64/-mx32 too, just some extra options are
> needed for ia32, it should have dg-additional-options with ia32 target.
>
> Furthermore, the submitter is asking for credit in the testcase, I think
> we don't generally do that unless the test is unreduced, but this test
> wasn't actually properly reduced, so I think it is better to reduce it
> (as done in the patch, the test still FAILs before r15-7700 and succeeds
> with current trunk).
>
> Ok for trunk?
>
> 2025-02-28  Jakub Jelinek  <ja...@redhat.com>
>
>         PR target/118940
>         * gcc.target/i386/pr118940.c: Drop -w, -g and -m32 from dg-options, 
> move
>         -march=i386 -mregparm=3 to dg-additional-options for ia32 and -fno-pie
>         to dg-additional-options for pie.  Reduce the test.

OK.

Thanks,
Uros.

>
> --- gcc/testsuite/gcc.target/i386/pr118940.c.jj 2025-02-27 22:04:36.045027595 
> +0100
> +++ gcc/testsuite/gcc.target/i386/pr118940.c    2025-02-28 08:55:14.831842185 
> +0100
> @@ -1,127 +1,30 @@
> +/* PR target/118940 */
>  /* { dg-do compile } */
> -/* { dg-options "-w -g -Os -march=i386 -mregparm=3 -m32 -fno-PIE" } */
> -
> -typedef unsigned char uint8_t;
> -typedef unsigned int uint32_t;
> -typedef unsigned int size_t;
> -typedef uint32_t bigint_element_t;
> -
> -/**
> - * Define a big-integer type
> - *
> - * @v size             Number of elements
> - * @ret bigint_t       Big integer type
> - */
> - #define bigint_t( size )                                              \
> - struct {                                                      \
> -      bigint_element_t element[ (size) ];                      \
> - }
> -
> -/**
> -* Determine number of elements required for a big-integer type
> -*
> -* @v len               Maximum length of big integer, in bytes
> -* @ret size            Number of elements
> -*/
> -#define bigint_required_size( len )                                    \
> - ( ( (len) + sizeof ( bigint_element_t ) - 1 ) /                       \
> -   sizeof ( bigint_element_t ) )
> -
> -/**
> - * Determine number of elements in big-integer type
> - *
> - * @v bigint           Big integer
> - * @ret size           Number of elements
> - */
> - #define bigint_size( bigint )                                         \
> - ( sizeof ( *(bigint) ) / sizeof ( (bigint)->element[0] ) )
> -
> - /**
> - * Initialise big integer
> - *
> - * @v value            Big integer to initialise
> - * @v data             Raw data
> - * @v len              Length of raw data
> - */
> -#define bigint_init( value, data, len ) do {                           \
> -       unsigned int size = bigint_size (value);                        \
> -       bigint_init_raw ( (value)->element, size, (data), (len) );      \
> -       } while ( 0 )
> -
> -
> -/**
> - * Calculate temporary working space required for moduluar exponentiation
> - *
> - * @v modulus          Big integer modulus
> - * @ret len            Length of temporary working space
> - */
> - #define bigint_mod_exp_tmp_len( modulus ) ( {                         \
> -       unsigned int size = bigint_size (modulus);                      \
> -       sizeof ( struct {                                               \
> -               bigint_t ( size ) temp[4];                              \
> -       } ); } )
> -
> -
> -/**
> - * Initialise big integer
> - *
> - * @v value0           Element 0 of big integer to initialise
> - * @v size             Number of elements
> - * @v data             Raw data
> - * @v len              Length of raw data
> - */
> - static inline __attribute__ (( always_inline )) void
> - bigint_init_raw ( uint32_t *value0, unsigned int size,
> -             const void *data, size_t len ) {
> -      bigint_t ( size ) __attribute__ (( may_alias )) *value =
> -           ( ( void * ) value0 );
> -      long pad_len = ( sizeof ( *value ) - len );
> -      void *discard_D;
> -      long discard_c;
> -
> -      /* Copy raw data in reverse order, padding with zeros */
> -      __asm__ __volatile__ ( "\n1:\n\t"
> -                       "movb -1(%3,%1), %%al\n\t"
> -                       "stosb\n\t"
> -                       "loop 1b\n\t"
> -                       "xorl %%eax, %%eax\n\t"
> -                       "mov %4, %1\n\t"
> -                       "rep stosb\n\t"
> -                       : "=&D" ( discard_D ), "=&c" ( discard_c ),
> -                      "+m" ( *value )
> -                       : "r" ( data ), "g" ( pad_len ), "0" ( value0 ),
> -                      "1" ( len )
> -                       : "eax" );
> - }
> -
> -extern void touch (void *, ...);
> -extern void touch3 (void *, void *, void *);
> -extern void touch2 (void *, void *);
> -
> -/**
> - * Perform big integer self-tests
> - *
> - */
> -void bigint_test_exec ( void ) {
> -    do{
> -       static const uint8_t base_raw[3] = {0};
> -       static const uint8_t modulus_raw[3] = {0};
> -       static const uint8_t exponent_raw[25] = {0};
> -       unsigned int size =
> -               bigint_required_size ( sizeof ( base_raw ) );
> -       unsigned int exponent_size =
> -               bigint_required_size ( sizeof ( exponent_raw ) );
> -       bigint_t ( size ) base_temp;
> -       bigint_t ( size ) modulus_temp;
> -       bigint_t ( exponent_size ) exponent_temp;
> -       size_t tmp_len = bigint_mod_exp_tmp_len ( &modulus_temp );
> -
> +/* { dg-options "-Os" } */
> +/* { dg-additional-options "-march=i386 -mregparm=3" { target ia32 } } */
> +/* { dg-additional-options "-fno-pie" { target pie } } */
> +
> +struct A { int a[10]; };
> +void *b;
> +long c;
> +char d[100];
> +int e;
> +void foo (void *, void *, void *);
> +
> +void
> +bar (int *x, int y, void *z, int w)
> +{
> +  (void) y;
> +  struct A *f = (void *) x;
> +  asm ("" : "=&D" (b), "=&c" (c), "+m" (*f) : "r" (z), "0" (x), "1" (w) : 
> "eax");
> +}
>
> -       touch ( &base_temp );
> -       bigint_init ( &modulus_temp, modulus_raw,
> -                     sizeof ( modulus_raw ) );
> -       bigint_init ( &exponent_temp, exponent_raw,
> -                     sizeof ( exponent_raw ) );
> -       touch3 ( &base_temp, &modulus_temp, &exponent_temp );
> -       } while ( 0 );
> +void
> +baz (void)
> +{
> +  struct A g, h;
> +  struct B { int a[e]; } i;
> +  bar (h.a, 0, d, 0);
> +  bar (i.a, 0, (void *) baz, 0);
> +  foo (&g, &h, &i);
>  }
>
>         Jakub
>

Reply via email to