mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
[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 commit9f2bc5077d
"[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 commita110855667
"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:
parent
6d4da4aeef
commit
8168338684
@ -65,12 +65,9 @@ gomp_gcn_enter_kernel (void)
|
||||
void * __lds *arena_start = (void * __lds *)TEAM_ARENA_START;
|
||||
void * __lds *arena_free = (void * __lds *)TEAM_ARENA_FREE;
|
||||
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_free = team_arena;
|
||||
*arena_end = team_arena + TEAM_ARENA_SIZE;
|
||||
# pragma GCC diagnostic pop
|
||||
|
||||
/* Allocate and initialize the team-local-storage data. */
|
||||
struct gomp_thread *thrs = team_malloc_cleared (sizeof (*thrs)
|
||||
|
@ -173,6 +173,9 @@ case "${target}" in
|
||||
|
||||
amdgcn*-*-*)
|
||||
config_path="gcn accel"
|
||||
|
||||
#TODO PR101484
|
||||
XCFLAGS="$XCFLAGS -Wno-error=array-bounds"
|
||||
;;
|
||||
|
||||
*)
|
||||
|
@ -128,10 +128,7 @@ team_malloc (size_t size)
|
||||
: "=v"(result) : "v"(TEAM_ARENA_FREE), "v"(size), "e"(1L) : "memory");
|
||||
|
||||
/* Handle OOM. */
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
|
||||
if (result + size > *(void * __lds *)TEAM_ARENA_END)
|
||||
# pragma GCC diagnostic pop
|
||||
{
|
||||
/* While this is experimental, let's make sure we know when OOM
|
||||
happens. */
|
||||
@ -162,11 +159,8 @@ team_free (void *ptr)
|
||||
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
|
||||
LDS loads are cheap. */
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
|
||||
if (ptr < *(void * __lds *)TEAM_ARENA_START
|
||||
|| ptr >= *(void * __lds *)TEAM_ARENA_END)
|
||||
# pragma GCC diagnostic pop
|
||||
free (ptr);
|
||||
}
|
||||
#else
|
||||
@ -795,19 +789,13 @@ static inline struct gomp_thread *gcn_thrs (void)
|
||||
{
|
||||
/* The value is at the bottom of LDS. */
|
||||
struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4;
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
|
||||
return *thrs;
|
||||
# pragma GCC diagnostic pop
|
||||
}
|
||||
static inline void set_gcn_thrs (struct gomp_thread *val)
|
||||
{
|
||||
/* The value is at the bottom of LDS. */
|
||||
struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds *)4;
|
||||
# pragma GCC diagnostic push
|
||||
# pragma GCC diagnostic ignored "-Warray-bounds" /*TODO PR101484 */
|
||||
*thrs = val;
|
||||
# pragma GCC diagnostic pop
|
||||
}
|
||||
static inline struct gomp_thread *gomp_thread (void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user