Hi,

I decided to spend some time looking at the large number of guality test failures on arm. I see a number of fails with gcc.dg/guality/pr36728-1.c as below. pr36728-2.c also fails in similar sort of ways. Before I go adjusting too many other tests I'd like to get some feedback regarding this from folks.

On ARM parameters are passed in r0 - r3 which maps to arg1 - arg4. The code generated appears to use r0 for the return value and as a temporary. r2 and r3 are used as temporaries to adjust the stack as those are the first temporaries used in the register allocaton order. Therefore it is understandeable that arg1, arg3 and arg4 end up being "optimized" out and there is no chance of reclaiming the information at line #16 or line #18 in the testcase linked. r1 gets used at O2 and therefore that starts failing at O2 and above.

Depending on optimization levels, registers used for arg1 - arg4 get reused at various optimization levels therefore we have no choice but to disable this lot.

Once you do that the only failures left are with the variable 'y' at optimization levels O2 and O3 which I'm going to leave as is until the time as I understand what's going on here. My initial thought is that this also appears to be a testism, but I'm not a 100% sure yet.

I pondered adding a testsuite keyword for this but it appears to be so special cased per target, that I don't see any easy way of handling this as each target appears to be special in the way in which it handles this - fundamentally would end up depending on the number of registers used as parameter registers and being caller saved registers and that varies from port to port.


FAIL: gcc.dg/guality/pr36728-1.c   -O1  line 16 arg3 == 3
FAIL: gcc.dg/guality/pr36728-1.c   -O1  line 16 arg4 == 4
FAIL: gcc.dg/guality/pr36728-1.c   -O1  line 18 arg1 == 1
FAIL: gcc.dg/guality/pr36728-1.c   -O1  line 18 arg3 == 3
FAIL: gcc.dg/guality/pr36728-1.c   -O1  line 18 arg4 == 4
FAIL: gcc.dg/guality/pr36728-1.c   -O2  line 18 arg2 == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O2  line 18 arg3 == 3
FAIL: gcc.dg/guality/pr36728-1.c   -O2  line 18 arg4 == 4
FAIL: gcc.dg/guality/pr36728-1.c   -O2  line 18 y == 2
FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none line 18 arg2 == 2 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none line 18 arg3 == 3 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none line 18 arg4 == 4 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none line 18 y == 2 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects line 18 arg1 == 1 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects line 18 arg2 == 2 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects line 18 arg3 == 3 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects line 18 arg4 == 4 FAIL: gcc.dg/guality/pr36728-1.c -O3 -fomit-frame-pointer line 18 arg2 == 2 FAIL: gcc.dg/guality/pr36728-1.c -O3 -fomit-frame-pointer line 18 arg3 == 3 FAIL: gcc.dg/guality/pr36728-1.c -O3 -fomit-frame-pointer line 18 arg4 == 4
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -fomit-frame-pointer  line 18 y == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -g  line 18 arg2 == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -g  line 18 arg3 == 3
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -g  line 18 arg4 == 4
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -g  line 18 y == 2

to

FAIL: gcc.dg/guality/pr36728-1.c   -O2  line 16 y == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O2  line 18 y == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -fomit-frame-pointer  line 16 y == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -fomit-frame-pointer  line 18 y == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -g  line 16 y == 2
FAIL: gcc.dg/guality/pr36728-1.c   -O3 -g  line 18 y == 2
FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none line 16 y == 2 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fno-use-linker-plugin -flto-partition=none line 18 y == 2 FAIL: gcc.dg/guality/pr36728-1.c -O2 -flto -fuse-linker-plugin -fno-fat-lto-objects line 16 y == 2


Changelog:

* gcc.dg/guality/pr36728-1.c: Skip some tests for arm.

Ok ? Thoughts ?

regards,
Ramana


P.S. I got caught out by the yama security module in the kernel preventing me from running some of the guality tests on the chromebook I was running this on. https://www.kernel.org/doc/Documentation/security/Yama.txt. JFTR it may be a good idea to do

 echo 0 > /proc/sys/kernel/yama/ptrace_scope


to get these things to work. Also I was using a trunk gdb to get these results.


diff --git a/gcc/testsuite/gcc.dg/guality/pr36728-1.c 
b/gcc/testsuite/gcc.dg/guality/pr36728-1.c
index ba7a6c2..6e6ba3f 100644
--- a/gcc/testsuite/gcc.dg/guality/pr36728-1.c
+++ b/gcc/testsuite/gcc.dg/guality/pr36728-1.c
@@ -23,20 +23,23 @@ foo (int arg1, int arg2, int arg3, int arg4, int arg5, int 
arg6, int arg7)
    when adjusting the addresses in order to meet the alignment
    requirements above.  They usually hold the function arguments arg1
    and arg2.  So it is expected that these values are unavailable in
-   some of these tests.  */
+   some of these tests.  On ARM, a similar problem occurs with registers
+   r0-r3 which contain arg1-arg4.  The registers r0-r3 are caller saved
+   and are used for various purposes including aligning the stack and
+   holding temporaries, thereby destroying the values in their parameters.  */
 
-/* { dg-final { gdb-test 16 "arg1" "1" { target { ! "s390*-*-*" } } } } */
-/* { dg-final { gdb-test 16 "arg2" "2" { target { ! "s390*-*-*" } } } } */
-/* { dg-final { gdb-test 16 "arg3" "3" } } */
-/* { dg-final { gdb-test 16 "arg4" "4" } } */
+/* { dg-final { gdb-test 16 "arg1" "1" { target { { ! "s390*-*-*" } && { ! 
"arm*-*-*" } } } } } */
+/* { dg-final { gdb-test 16 "arg2" "2" { target { { ! "s390*-*-*" } && { ! 
"arm*-*-*" } } } } } */
+/* { dg-final { gdb-test 16 "arg3" "3" { target { ! "arm*-*-*" } } } } */
+/* { dg-final { gdb-test 16 "arg4" "4" { target { ! "arm*-*-*" } } } } */
 /* { dg-final { gdb-test 16 "arg5" "5" } } */
 /* { dg-final { gdb-test 16 "arg6" "6" } } */
 /* { dg-final { gdb-test 16 "arg7" "30" } } */
 /* { dg-final { gdb-test 16 "y" "2" } } */
-/* { dg-final { gdb-test 18 "arg1" "1" { target { ! "s390*-*-*" } } } } */
-/* { dg-final { gdb-test 18 "arg2" "2" { target { ! "s390*-*-*" } } } } */
-/* { dg-final { gdb-test 18 "arg3" "3" } } */
-/* { dg-final { gdb-test 18 "arg4" "4" } } */
+/* { dg-final { gdb-test 18 "arg1" "1" { target { { ! "s390*-*-*" } && { ! 
"arm*-*-*" } } } } } */
+/* { dg-final { gdb-test 18 "arg2" "2" { target { { ! "s390*-*-*" } && { ! 
"arm*-*-*" } } } } } */
+/* { dg-final { gdb-test 18 "arg3" "3" { target { ! "arm*-*-*" } } } } */
+/* { dg-final { gdb-test 18 "arg4" "4" { target { ! "arm*-*-*" } } } } */
 /* { dg-final { gdb-test 18 "arg5" "5" } } */
 /* { dg-final { gdb-test 18 "arg6" "6" } } */
 /* { dg-final { gdb-test 18 "arg7" "30" } } */

Reply via email to