[gcn] Work-around libgomp 'error: array subscript 0 is outside array bounds of ‘__lds struct gomp_thread * __lds[0]’ [-Werror=array-bounds]' some more [PR101484]

With yesterday's commit 9f2bc5077d "[gcn]
Work-around libgomp 'error: array subscript 0 is outside array bounds of
‘__lds struct gomp_thread * __lds[0]’ [-Werror=array-bounds]' [PR101484]",
I did defuse the "unexpected" '-Werror=array-bounds' diagnostics that we see
as of commit a110855667 "Correct handling of
variable offset minus constant in -Warray-bounds [PR100137]".  However, these
'#pragma GCC diagnostic [...]' directives cause some code generation changes
(that seems unexpected, problematic!), which results in a lot (ten thousands)
of 'GCN team arena exhausted' run-time diagnostics, also leading to a few
FAILs:

    PASS: libgomp.c/../libgomp.c-c++-common/for-11.c (test for excess errors)
    [-PASS:-]{+FAIL:+} libgomp.c/../libgomp.c-c++-common/for-11.c execution test

    PASS: libgomp.c/../libgomp.c-c++-common/for-12.c (test for excess errors)
    [-PASS:-]{+FAIL:+} libgomp.c/../libgomp.c-c++-common/for-12.c execution test

    PASS: libgomp.c/../libgomp.c-c++-common/for-3.c (test for excess errors)
    [-PASS:-]{+FAIL:+} libgomp.c/../libgomp.c-c++-common/for-3.c execution test

    PASS: libgomp.c/../libgomp.c-c++-common/for-5.c (test for excess errors)
    [-PASS:-]{+FAIL:+} libgomp.c/../libgomp.c-c++-common/for-5.c execution test

    PASS: libgomp.c/../libgomp.c-c++-common/for-6.c (test for excess errors)
    [-PASS:-]{+FAIL:+} libgomp.c/../libgomp.c-c++-common/for-6.c execution test

    PASS: libgomp.c/../libgomp.c-c++-common/for-9.c (test for excess errors)
    [-PASS:-]{+FAIL:+} libgomp.c/../libgomp.c-c++-common/for-9.c execution test

Same for 'libgomp.c++'.

It remains to be analyzed how '#pragma GCC diagnostic [...]' directives can
cause code generation changes; for now I'm working around the "unexpected"
'-Werror=array-bounds' diagnostics differently.

Overall, still awaiting a different solution, of course.

	libgomp/
	PR target/101484
	* configure.tgt [amdgcn*-*-*] (XCFLAGS): Add
	'-Wno-error=array-bounds'.
	* config/gcn/team.c: Remove '-Werror=array-bounds' work-around.
	* libgomp.h [__AMDGCN__]: Likewise.
This commit is contained in:
Thomas Schwinge 2021-07-19 23:11:38 +02:00
parent 6d4da4aeef
commit 8168338684
3 changed files with 3 additions and 15 deletions

View File

@ -65,12 +65,9 @@ gomp_gcn_enter_kernel (void)
void * __lds *arena_start = (void * __lds *)TEAM_ARENA_START; void * __lds *arena_start = (void * __lds *)TEAM_ARENA_START;
void * __lds *arena_free = (void * __lds *)TEAM_ARENA_FREE; void * __lds *arena_free = (void * __lds *)TEAM_ARENA_FREE;
void * __lds *arena_end = (void * __lds *)TEAM_ARENA_END; void * __lds *arena_end = (void * __lds *)TEAM_ARENA_END;
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
*arena_start = team_arena; *arena_start = team_arena;
*arena_free = team_arena; *arena_free = team_arena;
*arena_end = team_arena + TEAM_ARENA_SIZE; *arena_end = team_arena + TEAM_ARENA_SIZE;
# pragma GCC diagnostic pop
/* Allocate and initialize the team-local-storage data. */ /* Allocate and initialize the team-local-storage data. */
struct gomp_thread *thrs = team_malloc_cleared (sizeof (*thrs) struct gomp_thread *thrs = team_malloc_cleared (sizeof (*thrs)

View File

@ -173,6 +173,9 @@ case "${target}" in
amdgcn*-*-*) amdgcn*-*-*)
config_path="gcn accel" config_path="gcn accel"
#TODO PR101484
XCFLAGS="$XCFLAGS -Wno-error=array-bounds"
;; ;;
*) *)

View File

@ -128,10 +128,7 @@ team_malloc (size_t size)
: "=v"(result) : "v"(TEAM_ARENA_FREE), "v"(size), "e"(1L) : "memory"); : "=v"(result) : "v"(TEAM_ARENA_FREE), "v"(size), "e"(1L) : "memory");
/* Handle OOM. */ /* Handle OOM. */
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
if (result + size > *(void * __lds *)TEAM_ARENA_END) if (result + size > *(void * __lds *)TEAM_ARENA_END)
# pragma GCC diagnostic pop
{ {
/* While this is experimental, let's make sure we know when OOM /* While this is experimental, let's make sure we know when OOM
happens. */ happens. */
@ -162,11 +159,8 @@ team_free (void *ptr)
However, if we fell back to using heap then we should free it. However, if we fell back to using heap then we should free it.
It would be better if this function could be a no-op, but at least It would be better if this function could be a no-op, but at least
LDS loads are cheap. */ LDS loads are cheap. */
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
if (ptr < *(void * __lds *)TEAM_ARENA_START if (ptr < *(void * __lds *)TEAM_ARENA_START
|| ptr >= *(void * __lds *)TEAM_ARENA_END) || ptr >= *(void * __lds *)TEAM_ARENA_END)
# pragma GCC diagnostic pop
free (ptr); free (ptr);
} }
#else #else
@ -795,19 +789,13 @@ static inline struct gomp_thread *gcn_thrs (void)
{ {
/* The value is at the bottom of LDS. */ /* The value is at the bottom of LDS. */
struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4; struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4;
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
return *thrs; return *thrs;
# pragma GCC diagnostic pop
} }
static inline void set_gcn_thrs (struct gomp_thread *val) static inline void set_gcn_thrs (struct gomp_thread *val)
{ {
/* The value is at the bottom of LDS. */ /* The value is at the bottom of LDS. */
struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4; struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4;
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
*thrs = val; *thrs = val;
# pragma GCC diagnostic pop
} }
static inline struct gomp_thread *gomp_thread (void) static inline struct gomp_thread *gomp_thread (void)
{ {