> Am 21.12.2024 um 06:29 schrieb Alexandre Oliva <ol...@adacore.com>:
>
> On Dec 20, 2024, Jakub Jelinek <ja...@redhat.com> wrote:
>
>>> On Wed, Dec 18, 2024 at 12:59:11AM -0300, Alexandre Oliva wrote:
>>> * gcc.dg/field-merge-16.c: New.
>
>> Note the test FAILs on i686-linux or on x86_64-linux with -m32.
>
> Also fixed herein.
>
>
> A number of tests that check for specific ifcombine transformations
> fail on AVR and PRU targets, whose type sizes and alignments aren't
> conducive of the expected transformations. Adjust the expectations.
>
> Most execution tests should run successfully regardless of the
> transformations, but a few that could conceivably fail if short and
> char have the same bit width now check for that and bypass the tests
> that would fail.
>
> Conversely, one test that had such a runtime test, but that would work
> regardless, no longer has that runtime test, and its types are
> narrowed so that the transformations on 32-bit targets are more likely
> to be the same as those that used to take place on 64-bit targets.
> This latter change is somewhat obviated by a separate patch, but I've
> left it in place anyway.
>
> Regstrapped on x86_64-linux-gnu. I'd appreciate if someone who can test
> AVR and PRU would confirm that it fixes all field-merge-* failures. Ok
> to install?
Ok
Richard
>
> for gcc/testsuite/ChangeLog
>
> PR testsuite/118025
> * field-merge-1.c: Skip BIT_FIELD_REF counting on AVR and PRU.
> * field-merge-3.c: Bypass the test if short doesn't have the
> expected size.
> * field-merge-8.c: Likewise.
> * field-merge-9.c: Likewise. Skip optimization counting on
> AVR and PRU.
> * field-merge-14.c: Skip optimization counting on AVR and PRU.
> * field-merge-15.c: Likewise.
> * field-merge-17.c: Likewise.
> * field-merge-16.c: Likewise. Drop runtime bypass. Use
> smaller types.
> ---
> gcc/testsuite/gcc.dg/field-merge-1.c | 2 +-
> gcc/testsuite/gcc.dg/field-merge-13.c | 2 +-
> gcc/testsuite/gcc.dg/field-merge-14.c | 3 ++-
> gcc/testsuite/gcc.dg/field-merge-15.c | 2 +-
> gcc/testsuite/gcc.dg/field-merge-16.c | 17 +++++++----------
> gcc/testsuite/gcc.dg/field-merge-17.c | 2 +-
> gcc/testsuite/gcc.dg/field-merge-3.c | 2 ++
> gcc/testsuite/gcc.dg/field-merge-8.c | 2 ++
> gcc/testsuite/gcc.dg/field-merge-9.c | 4 +++-
> 9 files changed, 20 insertions(+), 16 deletions(-)
>
> diff --git a/gcc/testsuite/gcc.dg/field-merge-1.c
> b/gcc/testsuite/gcc.dg/field-merge-1.c
> index 1818e104437e1..4405d40ee79d8 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-1.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-1.c
> @@ -58,7 +58,7 @@ int main () {
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump-times "BIT_FIELD_REF" 8 "optimized" } } */
> +/* { dg-final { scan-tree-dump-times "BIT_FIELD_REF" 8 "optimized" { target
> { ! { avr-*-* pru-*-* } } } } } */
> /* { dg-final { scan-assembler-not "cmpb" { target { i*86-*-* || x86_64-*-* }
> } } } */
> /* { dg-final { scan-assembler-times "cmpl" 8 { target { i*86-*-* ||
> x86_64-*-* } } } } */
> /* { dg-final { scan-assembler-times "cmpw" 8 { target { powerpc*-*-* ||
> rs6000-*-* } } } } */
> diff --git a/gcc/testsuite/gcc.dg/field-merge-13.c
> b/gcc/testsuite/gcc.dg/field-merge-13.c
> index 7e4f4c499347f..eeef73338f8e5 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-13.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-13.c
> @@ -90,4 +90,4 @@ int main () {
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump-times "optimizing" 9 "ifcombine" } } */
> +/* { dg-final { scan-tree-dump-times "optimizing" 9 "ifcombine" { target { !
> { avr-*-* pru-*-* } } } } } */
> diff --git a/gcc/testsuite/gcc.dg/field-merge-14.c
> b/gcc/testsuite/gcc.dg/field-merge-14.c
> index 91d84cfebf196..73259e0936e4e 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-14.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-14.c
> @@ -1,7 +1,8 @@
> /* { dg-do run } */
> /* { dg-options "-O -fdump-tree-ifcombine-details" } */
>
> -/* Check that we don't get confused by multiple conversions. */
> +/* Check that we don't get confused by multiple conversions. Conceivably, we
> + could combine both tests using b, but the current logic won't do that. */
>
> __attribute__((noipa))
> int f(int *a,int *d)
> diff --git a/gcc/testsuite/gcc.dg/field-merge-15.c
> b/gcc/testsuite/gcc.dg/field-merge-15.c
> index 34641e893c92f..fc38464527161 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-15.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-15.c
> @@ -33,4 +33,4 @@ int main () {
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump-times "optimizing" 6 "ifcombine" } } */
> +/* { dg-final { scan-tree-dump-times "optimizing" 6 "ifcombine" { target { !
> { avr-*-* pru-*-* } } } } } */
> diff --git a/gcc/testsuite/gcc.dg/field-merge-16.c
> b/gcc/testsuite/gcc.dg/field-merge-16.c
> index 2ca23ea663a45..afdaf45b6a949 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-16.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-16.c
> @@ -4,17 +4,17 @@
> /* Check that tests for sign-extension bits are handled correctly. */
>
> struct s {
> - short a;
> - short b;
> - unsigned short c;
> - unsigned short d;
> -} __attribute__ ((aligned (8)));
> + signed char a;
> + signed char b;
> + unsigned char c;
> + unsigned char d;
> +} __attribute__ ((aligned (4)));
>
> struct s p = { -1, 0, 0, 0 };
> struct s q = { 0, -1, 0, 0 };
> struct s r = { 1, 1, 0, 0 };
>
> -const long long mask = 1ll << (sizeof (long long) * __CHAR_BIT__ - 5);
> +const long mask = 1l << (sizeof (long) * __CHAR_BIT__ - 5);
>
> int fp ()
> {
> @@ -50,9 +50,6 @@ int fr ()
> }
>
> int main () {
> - /* Unlikely, but play safe. */
> - if (sizeof (long long) == sizeof (short))
> - return 0;
> if (fp () < 0
> || fq () < 0
> || fr () > 0)
> @@ -63,4 +60,4 @@ int main () {
> /* We test .b after other fields instead of right after .a to give field
> merging a chance, otherwise the masked compares with zero are combined by
> other ifcombine logic. The .c test is discarded by earlier optimizers. */
> -/* { dg-final { scan-tree-dump-times "optimizing" 6 "ifcombine" } } */
> +/* { dg-final { scan-tree-dump-times "optimizing" 6 "ifcombine" { target { !
> { avr-*-* pru-*-* } } } } } */
> diff --git a/gcc/testsuite/gcc.dg/field-merge-17.c
> b/gcc/testsuite/gcc.dg/field-merge-17.c
> index 06c8ec16e86c6..a42658ac5c516 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-17.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-17.c
> @@ -43,4 +43,4 @@ int main () {
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump-times "optimizing" 4 "ifcombine" } } */
> +/* { dg-final { scan-tree-dump-times "optimizing" 4 "ifcombine" { target { !
> { avr-*-* pru-*-* } } } } } */
> diff --git a/gcc/testsuite/gcc.dg/field-merge-3.c
> b/gcc/testsuite/gcc.dg/field-merge-3.c
> index f26e8a96ea04f..a9fe404fa4261 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-3.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-3.c
> @@ -31,6 +31,8 @@ void f (void) {
> }
>
> int main () {
> + if (sizeof (short) != 2)
> + return 0;
> f ();
> return 0;
> }
> diff --git a/gcc/testsuite/gcc.dg/field-merge-8.c
> b/gcc/testsuite/gcc.dg/field-merge-8.c
> index ae270e10070e4..7d49c2789013b 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-8.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-8.c
> @@ -20,6 +20,8 @@ void f (void) {
> }
>
> int main () {
> + if (sizeof (short) != 2)
> + return 0;
> f ();
> return 0;
> }
> diff --git a/gcc/testsuite/gcc.dg/field-merge-9.c
> b/gcc/testsuite/gcc.dg/field-merge-9.c
> index 04df54c2b74ef..49ef59847ac07 100644
> --- a/gcc/testsuite/gcc.dg/field-merge-9.c
> +++ b/gcc/testsuite/gcc.dg/field-merge-9.c
> @@ -29,8 +29,10 @@ void f (void) {
> }
>
> int main () {
> + if (sizeof (short) != 2)
> + return 0;
> f ();
> return 0;
> }
>
> -/* { dg-final { scan-tree-dump-times "optimizing two comparisons" 2
> "ifcombine" } } */
> +/* { dg-final { scan-tree-dump-times "optimizing two comparisons" 2
> "ifcombine" { target { ! { avr-*-* pru-*-* } } } } } */
>
>
> --
> Alexandre Oliva, happy hacker https://FSFLA.org/blogs/lxo/
> Free Software Activist GNU Toolchain Engineer
> More tolerance and less prejudice are key for inclusion and diversity
> Excluding neuro-others for not behaving ""normal"" is *not* inclusive