diff mbox series

libgomp/testsuite: Fix checks for dg-excess-errors

Message ID 92151547-dad5-c127-4cde-c9bbd27217f5@codesourcery.com
State New
Headers show
Series libgomp/testsuite: Fix checks for dg-excess-errors | expand

Commit Message

Tobias Burnus April 21, 2021, 5:04 p.m. UTC
This was brought up by Richard when testing libgomp with the GCC 11 distribution
compiler, which has both nvptx and gcn enabled – but no offloading device was
available.

This lead to fails for:
* testsuite/libgomp.c-c++-common/function-not-offloaded.c:
   → function (on purpose) not marked for offline
   → issue: dg-excess-errors by lto1/mkoffload not ignored
* testsuite/libgomp.c-c++-common/variable-not-offloaded.c
   → likewise for variables, except that this would succeed
   with unified-shared memory
   → issue: dg-excess-errors by lto1/mkoffload not ignored
* libgomp/testsuite/libgomp.c/pr86416-1.c + *-2.c
   → expected fail when offloading compiler does not support
   long double or float128
   → issue: error output but dg-error/dg-excess-error not active

The reason for those fails is that used effective target checks
do not cover those cases correctly. Namely:

* offload_device - check whether an offloading device is
   available & used at run time.
   → problem: compilation was done for the device but here
   no device is available
* offload_device_nonshared_as
   → Likewise and same issue, except that also 0 is returned
   if the device has unified shared memory.

Solution: Explicitly check for nvptx/gcn offload compilation
(but ignore device availability).
[Uses 'gcc -v |grep ^OFFLOAD_TARGET_NAMES=', which honors
-foffload=, including -foffload=disable.]

OK for mainline and GCC 11?


Tested without offloading support & with nvptx &
offload support (with an offloading device available).

@Richard: I would be happy if you could confirm that this fixes
your issue.

Note: I don't know what's needed for *intelmic* - but I wouldn't
be surprised if the current settings were wrong as well.
(long double/float128 supported? unified shared memory? Only
needed for function-not-offloaded.c? - if the latter, a check
whether any OFFLOAD_TARGET_NAMES=* exists would be one option.)

Tobias

-----------------
Mentor Graphics (Deutschland) GmbH, Arnulfstrasse 201, 80634 München Registergericht München HRB 106955, Geschäftsführer: Thomas Heurung, Frank Thürauf

Comments

Jakub Jelinek April 21, 2021, 5:40 p.m. UTC | #1
On Wed, Apr 21, 2021 at 07:04:17PM +0200, Tobias Burnus wrote:
> OK for mainline and GCC 11?

Ok for 12 and 11.2 (i.e. after 11.1 GA).

> libgomp/testsuite: Fix checks for dg-excess-errors
> 
> For the tests modified below, the effective target line has to be effective
> when compiling for an offload target, except that variable-not-offloaded.c
> would compile with unified-share memory and pr86416-*.c if long double/float128
> is supported.
> The previous check used a run-time device ability check. This new variant
> now enables those dg- lines when _compiling_ for nvptx or gcn.
> 
> libgomp/ChangeLog:
> 
> 	* testsuite/lib/libgomp.exp (offload_target_to_openacc_device_type):
> 	New, based on check_effective_target_offload_target_nvptx.
> 	(check_effective_target_offload_target_nvptx): Call it.
> 	(check_effective_target_offload_target_amdgcn): New.
> 	* testsuite/libgomp.c-c++-common/function-not-offloaded.c:
> 	Require target offload_target_nvptx || offload_target_amdgcn.
> 	* testsuite/libgomp.c-c++-common/variable-not-offloaded.c: Likewise.
> 	* testsuite/libgomp.c/pr86416-1.c: Likewise.
> 	* testsuite/libgomp.c/pr86416-2.c: Likewise.

	Jakub
Richard Biener April 22, 2021, 7:51 a.m. UTC | #2
On Wed, 21 Apr 2021, Tobias Burnus wrote:

> This was brought up by Richard when testing libgomp with the GCC 11
> distribution
> compiler, which has both nvptx and gcn enabled – but no offloading device was
> available.
> 
> This lead to fails for:
> * testsuite/libgomp.c-c++-common/function-not-offloaded.c:
>   → function (on purpose) not marked for offline
>   → issue: dg-excess-errors by lto1/mkoffload not ignored
> * testsuite/libgomp.c-c++-common/variable-not-offloaded.c
>   → likewise for variables, except that this would succeed
>   with unified-shared memory
>   → issue: dg-excess-errors by lto1/mkoffload not ignored
> * libgomp/testsuite/libgomp.c/pr86416-1.c + *-2.c
>   → expected fail when offloading compiler does not support
>   long double or float128
>   → issue: error output but dg-error/dg-excess-error not active
> 
> The reason for those fails is that used effective target checks
> do not cover those cases correctly. Namely:
> 
> * offload_device - check whether an offloading device is
>   available & used at run time.
>   → problem: compilation was done for the device but here
>   no device is available
> * offload_device_nonshared_as
>   → Likewise and same issue, except that also 0 is returned
>   if the device has unified shared memory.
> 
> Solution: Explicitly check for nvptx/gcn offload compilation
> (but ignore device availability).
> [Uses 'gcc -v |grep ^OFFLOAD_TARGET_NAMES=', which honors
> -foffload=, including -foffload=disable.]
> 
> OK for mainline and GCC 11?
> 
> 
> Tested without offloading support & with nvptx &
> offload support (with an offloading device available).
> 
> @Richard: I would be happy if you could confirm that this fixes
> your issue.

So with this I'm down to

                === libgomp tests ===


Running target unix
XPASS: libgomp.c/../libgomp.c-c++-common/pr96390.c (test for excess 
errors)
FAIL: libgomp.c/target-28.c (test for excess errors)
UNRESOLVED: libgomp.c/target-28.c compilation failed to produce executable
XPASS: libgomp.c++/../libgomp.c-c++-common/pr96390.c (test for excess 
errors)
XPASS: libgomp.c++/pr96390.C (test for excess errors)
FAIL: libgomp.c++/target-13.C (test for excess errors)
UNRESOLVED: libgomp.c++/target-13.C compilation failed to produce 
executable

                === libgomp Summary ===

# of expected passes            8411
# of unexpected failures        2
# of unexpected successes       3

which is nice.  The target-28.c FAIL is

spawn -ignore SIGHUP 
/home/abuild/rpmbuild/BUILD/gcc-11.0.1+git10/obj-x86_64-suse-linux/./gcc/xgcc 
-B/home/abuild/rpmbuild/BUILD/gcc-11.0.1+git10/obj-x86_64-suse-linux/./gcc/ 
-B/usr/x86_64-suse-linux/bin/ -B/usr/x86_64-suse-linux/lib/ -isystem 
/usr/x86_64-suse-linux/include -isystem /usr/x86_64-suse-linux/sys-include 
-fchecking=1 ../../../../libgomp/testsuite/libgomp.c/target-28.c 
-B/home/abuild/rpmbuild/BUILD/gcc-11.0.1+git10/obj-x86_64-suse-linux/x86_64-suse-linux/./libgomp/ 
-B/home/abuild/rpmbuild/BUILD/gcc-11.0.1+git10/obj-x86_64-suse-linux/x86_64-suse-linux/./libgomp/.libs 
-I/home/abuild/rpmbuild/BUILD/gcc-11.0.1+git10/obj-x86_64-suse-linux/x86_64-suse-linux/./libgomp 
-I../../../../libgomp/testsuite/../../include 
-I../../../../libgomp/testsuite/.. -Lno -fmessage-length=0 
-fno-diagnostics-show-caret -fdiagnostics-color=never 
-B/usr/lib64/gcc/x86_64-suse-linux/11 -B/usr/bin 
-B/usr/lib64/gcc/x86_64-suse-linux/11 -B/usr/bin -fopenmp -O2 
-L/home/abuild/rpmbuild/BUILD/gcc-11.0.1+git10/obj-x86_64-suse-linux/x86_64-suse-linux/./libgomp/.libs 
-lm -o ./target-28.exe^M
^[[1m/tmp/ccCLBCvn.mkoffload.2.s:233:2: ^[[0m^[[0;1;31merror: 
^[[0m^[[1ms.3 changed binding to STB_GLOBAL^M
^[[0m        .global s.3^M
^[[0;1;32m        ^^M
^[[0m^[[1m/tmp/ccCLBCvn.mkoffload.2.s:234:2: ^[[0m^[[0;1;31merror: 
^[[0m^[[1ms.2 changed binding to STB_GLOBAL^M
^[[0m        .global s.2^M
^[[0;1;32m        ^^M
^[[0mmkoffload: fatal error: 
/usr/bin//x86_64-suse-linux-accel-amdgcn-amdhsa-gcc-11 returned 1 exit 
status^M
compilation terminated.^M
lto-wrapper: fatal error: 
/usr/lib64/gcc/x86_64-suse-linux/11//accel/amdgcn-amdhsa/mkoffload 
returned 1 exit status^M

and the target-13.C one is similar.

Richard.
diff mbox series

Patch

libgomp/testsuite: Fix checks for dg-excess-errors

For the tests modified below, the effective target line has to be effective
when compiling for an offload target, except that variable-not-offloaded.c
would compile with unified-share memory and pr86416-*.c if long double/float128
is supported.
The previous check used a run-time device ability check. This new variant
now enables those dg- lines when _compiling_ for nvptx or gcn.

libgomp/ChangeLog:

	* testsuite/lib/libgomp.exp (offload_target_to_openacc_device_type):
	New, based on check_effective_target_offload_target_nvptx.
	(check_effective_target_offload_target_nvptx): Call it.
	(check_effective_target_offload_target_amdgcn): New.
	* testsuite/libgomp.c-c++-common/function-not-offloaded.c:
	Require target offload_target_nvptx || offload_target_amdgcn.
	* testsuite/libgomp.c-c++-common/variable-not-offloaded.c: Likewise.
	* testsuite/libgomp.c/pr86416-1.c: Likewise.
	* testsuite/libgomp.c/pr86416-2.c: Likewise.

 libgomp/testsuite/lib/libgomp.exp                    | 20 ++++++++++++++++----
 .../libgomp.c-c++-common/function-not-offloaded.c    |  2 +-
 .../libgomp.c-c++-common/variable-not-offloaded.c    |  4 ++--
 libgomp/testsuite/libgomp.c/pr86416-1.c              |  4 ++--
 libgomp/testsuite/libgomp.c/pr86416-2.c              |  4 ++--
 5 files changed, 23 insertions(+), 11 deletions(-)

diff --git a/libgomp/testsuite/lib/libgomp.exp b/libgomp/testsuite/lib/libgomp.exp
index 14dcfdfd00a..467cb3cf255 100644
--- a/libgomp/testsuite/lib/libgomp.exp
+++ b/libgomp/testsuite/lib/libgomp.exp
@@ -340,8 +340,10 @@  proc offload_target_to_openacc_device_type { offload_target } {
     }
 }
 
-# Return 1 if compiling for offload target nvptx.
-proc check_effective_target_offload_target_nvptx { } {
+# Return 1 if compiling for the specified offload target
+# Takes -foffload=... into account by checking OFFLOAD_TARGET_NAMES=
+# in the -v compiler output.
+proc libgomp_check_effective_target_offload_target { target_name } {
     # Consider all actual options, including the flags passed to
     # 'gcc-dg-runtest', or 'gfortran-dg-runtest' (see the 'libgomp.*/*.exp'
     # files; in particular, '-foffload', 'libgomp.oacc-*/*.exp'), which don't
@@ -354,13 +356,23 @@  proc check_effective_target_offload_target_nvptx { } {
     set gcc_output [libgomp_target_compile "" "" "none" $options]
     if [regexp "(?n)^OFFLOAD_TARGET_NAMES=(.*)" $gcc_output dummy offload_targets] {
 	verbose "compiling for offload targets: $offload_targets"
-	return [string match "*:nvptx*:*" ":$offload_targets:"]
+	return [string match "*:$target_name*:*" ":$offload_targets:"]
     }
 
-    verbose "not compiling for any offload targets"
+    verbose "not compiling for $target_name offload target"
     return 0
 }
 
+# Return 1 if compiling for offload target nvptx.
+proc check_effective_target_offload_target_nvptx { } {
+    return [libgomp_check_effective_target_offload_target "nvptx"]
+}
+
+# Return 1 if compiling for offload target amdgcn
+proc check_effective_target_offload_target_amdgcn { } {
+    return [libgomp_check_effective_target_offload_target "amdgcn"]
+}
+
 # Return 1 if offload device is available.
 proc check_effective_target_offload_device { } {
     return [check_runtime_nocache offload_device_available_ {
diff --git a/libgomp/testsuite/libgomp.c-c++-common/function-not-offloaded.c b/libgomp/testsuite/libgomp.c-c++-common/function-not-offloaded.c
index 9e59ef8864e..bc1ae68941a 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/function-not-offloaded.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/function-not-offloaded.c
@@ -1,5 +1,5 @@ 
 /* { dg-do link } */
-/* { dg-excess-errors "unresolved symbol foo, lto1, mkoffload and lto-wrapper fatal errors" { target offload_device_nonshared_as } } */
+/* { dg-excess-errors "unresolved symbol foo, lto1, mkoffload and lto-wrapper fatal errors" { target { offload_target_nvptx || offload_target_amdgcn } } } */
 /* { dg-additional-sources "function-not-offloaded-aux.c" } */
 
 #pragma omp declare target
diff --git a/libgomp/testsuite/libgomp.c-c++-common/variable-not-offloaded.c b/libgomp/testsuite/libgomp.c-c++-common/variable-not-offloaded.c
index bc4b916e9a4..fe2a8b26242 100644
--- a/libgomp/testsuite/libgomp.c-c++-common/variable-not-offloaded.c
+++ b/libgomp/testsuite/libgomp.c-c++-common/variable-not-offloaded.c
@@ -1,7 +1,7 @@ 
 /* { dg-do link } */
-/* { dg-excess-errors "lto1, mkoffload and lto-wrapper fatal errors" { target offload_device_nonshared_as } } */
+/* { dg-excess-errors "lto1, mkoffload and lto-wrapper fatal errors" { target { offload_target_nvptx || offload_target_amdgcn } } } */
 
-int var; /* { dg-error "variable 'var' has been referenced in offloaded code but hasn't been marked to be included in the offloaded code" "" { target offload_device_nonshared_as } } */
+int var; /* { dg-error "variable 'var' has been referenced in offloaded code but hasn't been marked to be included in the offloaded code" "" { target { offload_target_nvptx || offload_target_amdgcn } } } */
 
 #pragma omp declare target
 void  __attribute__((noinline, noclone))
diff --git a/libgomp/testsuite/libgomp.c/pr86416-1.c b/libgomp/testsuite/libgomp.c/pr86416-1.c
index ad9370f78f3..6d3869264fd 100644
--- a/libgomp/testsuite/libgomp.c/pr86416-1.c
+++ b/libgomp/testsuite/libgomp.c/pr86416-1.c
@@ -2,8 +2,8 @@ 
 /* { dg-require-effective-target large_long_double } */
 
 /* PR middle-end/86416  */
-/* { dg-error "bit-precision floating-point numbers unsupported .mode '.F'." "" { target offload_device } 0 }  */
-/* { dg-excess-errors "Follow-up errors from mkoffload and lto-wrapper" { target offload_device } }  */
+/* { dg-error "bit-precision floating-point numbers unsupported .mode '.F'." "" { target { offload_target_nvptx || offload_target_amdgcn } } 0 }  */
+/* { dg-excess-errors "Follow-up errors from mkoffload and lto-wrapper" { target { offload_target_nvptx || offload_target_amdgcn } } }  */
 
 #include <stdlib.h>  /* For abort. */
 
diff --git a/libgomp/testsuite/libgomp.c/pr86416-2.c b/libgomp/testsuite/libgomp.c/pr86416-2.c
index ec45e400f95..cffeb3f7107 100644
--- a/libgomp/testsuite/libgomp.c/pr86416-2.c
+++ b/libgomp/testsuite/libgomp.c/pr86416-2.c
@@ -2,8 +2,8 @@ 
 /* { dg-add-options __float128 } */
 
 /* PR middle-end/86416  */
-/* { dg-error "bit-precision floating-point numbers unsupported .mode '.F'." "" { target offload_device } 0 }  */
-/* { dg-excess-errors "Follow-up errors from mkoffload and lto-wrapper" { target offload_device } }  */
+/* { dg-error "bit-precision floating-point numbers unsupported .mode '.F'." "" { target { offload_target_nvptx || offload_target_amdgcn } } 0 }  */
+/* { dg-excess-errors "Follow-up errors from mkoffload and lto-wrapper" { target { offload_target_nvptx || offload_target_amdgcn } } }  */
 
 #include <stdlib.h>  /* For abort. */