Hi all,
As described in https://gcc.gnu.org/ml/gcc-patches/2018-09/msg00963.html this
test generates UXTW instructions with -mabi=ilp32
because the foo* functions take pointers and store results into them. In ILP32
the callee clears the top bits with a UXTW.
This trips the scan-assembler-not UXTW test that checks that the zero_extend
form of the BFXIL pattern is used, which it is.
This patch avoids this problem by not passing pointers to the results, but
instead using global variables for which the foo* functions
will synthesise the address using ADRP, avoiding the UXTW instructions.
With this patch the test PASSes fully with -mabi=ilp32 and still PASSes on LP64.
Committing to trunk as obvious.
Thanks,
Kyrill
2018-09-18 Kyrylo Tkachov <[email protected]>
* gcc.target/aarch64/combine_bfxil.c: Avoid passing pointers to
functions.
diff --git a/gcc/testsuite/gcc.target/aarch64/combine_bfxil.c b/gcc/testsuite/gcc.target/aarch64/combine_bfxil.c
index 98f6159fbda0978dd863f16d5d88dbff8c4b343f..84e5377ce9a10953f50b7c13ed06563bef014a55 100644
--- a/gcc/testsuite/gcc.target/aarch64/combine_bfxil.c
+++ b/gcc/testsuite/gcc.target/aarch64/combine_bfxil.c
@@ -19,7 +19,7 @@ combine_balanced (unsigned long long a, unsigned long long b)
unsigned long long
combine_minimal (unsigned long long a, unsigned long long b)
{
- return (a & 0xfffffffffffffffe) | (b & 0x0000000000000001);
+ return (a & 0xfffffffffffffffell) | (b & 0x0000000000000001ll);
}
unsigned long long
@@ -40,77 +40,77 @@ combine_unbalanced_int (unsigned int a, unsigned int b)
return (a & 0xffffff00ll) | (b & 0x000000ffll);
}
+unsigned long long c, d;
+
__attribute__ ((noinline)) void
-foo (unsigned long long a, unsigned long long b, unsigned long long *c,
- unsigned long long *d)
+foo (unsigned long long a, unsigned long long b)
{
- *c = combine_minimal (a, b);
- *d = combine_minimal (b, a);
+ c = combine_minimal (a, b);
+ d = combine_minimal (b, a);
}
__attribute__ ((noinline)) void
-foo2 (unsigned long long a, unsigned long long b, unsigned long long *c,
- unsigned long long *d)
+foo2 (unsigned long long a, unsigned long long b)
{
- *c = combine_balanced (a, b);
- *d = combine_balanced (b, a);
+ c = combine_balanced (a, b);
+ d = combine_balanced (b, a);
}
__attribute__ ((noinline)) void
-foo3 (unsigned long long a, unsigned long long b, unsigned long long *c,
- unsigned long long *d)
+foo3 (unsigned long long a, unsigned long long b)
{
- *c = combine_unbalanced (a, b);
- *d = combine_unbalanced (b, a);
+ c = combine_unbalanced (a, b);
+ d = combine_unbalanced (b, a);
}
+unsigned int ic, id;
+
void
-foo4 (unsigned int a, unsigned int b, unsigned int *c, unsigned int *d)
+foo4 (unsigned int a, unsigned int b)
{
- *c = combine_balanced_int (a, b);
- *d = combine_balanced_int (b, a);
+ ic = combine_balanced_int (a, b);
+ id = combine_balanced_int (b, a);
}
void
-foo5 (unsigned int a, unsigned int b, unsigned int *c, unsigned int *d)
+foo5 (unsigned int a, unsigned int b)
{
- *c = combine_unbalanced_int (a, b);
- *d = combine_unbalanced_int (b, a);
+ ic = combine_unbalanced_int (a, b);
+ id = combine_unbalanced_int (b, a);
}
void
-foo6 (unsigned int a, unsigned int b, unsigned long long *c, unsigned long long *d)
+foo6 (unsigned int a, unsigned int b)
{
- *c = combine_zero_extended_int(a, b);
- *d = combine_zero_extended_int(b, a);
+ c = combine_zero_extended_int(a, b);
+ d = combine_zero_extended_int(b, a);
}
int
main (void)
{
- unsigned long long a = 0x0123456789ABCDEF, b = 0xFEDCBA9876543210, c, d;
- foo3 (a, b, &c, &d);
+ unsigned long long a = 0x0123456789ABCDEF, b = 0xFEDCBA9876543210;
+ foo3 (a, b);
if (c != 0x0123456789543210) abort ();
if (d != 0xfedcba9876abcdef) abort ();
- foo2 (a, b, &c, &d);
+ foo2 (a, b);
if (c != 0x0123456776543210) abort ();
if (d != 0xfedcba9889abcdef) abort ();
- foo (a, b, &c, &d);
+ foo (a, b);
if (c != 0x0123456789abcdee) abort ();
if (d != 0xfedcba9876543211) abort ();
- unsigned int a2 = 0x01234567, b2 = 0xFEDCBA98, c2, d2;
- foo4 (a2, b2, &c2, &d2);
- if (c2 != 0x0123ba98) abort ();
- if (d2 != 0xfedc4567) abort ();
- foo5 (a2, b2, &c2, &d2);
- if (c2 != 0x01234598) abort ();
- if (d2 != 0xfedcba67) abort ();
-
- unsigned long long c3, d3;
- foo6 (a2, b2, &c3, &d3);
- if (c3 != 0x0123ba98) abort ();
- if (d3 != 0xfedc4567) abort ();
+ unsigned int a2 = 0x01234567, b2 = 0xFEDCBA98;
+ foo4 (a2, b2);
+ if (ic != 0x0123ba98) abort ();
+ if (id != 0xfedc4567) abort ();
+ foo5 (a2, b2);
+ if (ic != 0x01234598) abort ();
+ if (id != 0xfedcba67) abort ();
+
+ foo6 (a2, b2);
+ if (c != 0x0123ba98) abort ();
+ if (d != 0xfedc4567) abort ();
return 0;
}