Hi!

On 2021-07-20T09:23:24+0200, I wrote:
> On 2021-07-19T10:46:35+0200, I wrote:
>> | On 7/16/21 11:42 AM, Thomas Schwinge wrote:
>> |> On 2021-07-09T17:11:25-0600, Martin Sebor via Gcc-patches 
>> <gcc-patches@gcc.gnu.org> wrote:
>> |>> The attached tweak avoids the new -Warray-bounds instances when
>> |>> building libatomic for arm. Christophe confirms it resolves
>> |>> the problem (thank you!)
>> |>
>> |> As Abid has just reported in
>> |> <https://gcc.gnu.org/bugzilla/show_bug.cgi?id=101374#c16>, similar
>> |> problem with GCN target libgomp build:
>> |>
>> |>      In function ‘gcn_thrs’,
>> |>          inlined from ‘gomp_thread’ at 
>> [...]/source-gcc/libgomp/libgomp.h:803:10,
>> |>          inlined from ‘GOMP_barrier’ at 
>> [...]/source-gcc/libgomp/barrier.c:34:29:
>> |>      [...]/source-gcc/libgomp/libgomp.h:792:10: error: array subscript 0 
>> is outside array bounds of ‘__lds struct gomp_thread * __lds[0]’ 
>> [-Werror=array-bounds]
>> |>        792 |   return *thrs;
>> |>            |          ^~~~~
>> |>
>> |>      gcc/config/gcn/gcn.h:  c_register_addr_space ("__lds", 
>> ADDR_SPACE_LDS);                   \
>> |>
>> |>      libgomp/libgomp.h-static inline struct gomp_thread *gcn_thrs (void)
>> |>      libgomp/libgomp.h-{
>> |>      libgomp/libgomp.h-  /* The value is at the bottom of LDS.  */
>> |>      libgomp/libgomp.h:  struct gomp_thread * __lds *thrs = (struct 
>> gomp_thread * __lds *)4;
>> |>      libgomp/libgomp.h-  return *thrs;
>> |>      libgomp/libgomp.h-}
>> |>
>> |> ..., plus a few more.  Work-around:
>> |>
>> |>         struct gomp_thread * __lds *thrs = (struct gomp_thread * __lds 
>> *)4;
>> |>      +# pragma GCC diagnostic push
>> |>      +# pragma GCC diagnostic ignored "-Warray-bounds"
>> |>         return *thrs;
>> |>      +# pragma GCC diagnostic pop
>> |>
>> |> ..., but it's a bit tedious to add that in all that the other places,
>> |> too.
>>
>> Wasn't so bad after all; a lot of duplicates due to 'libgomp.h'.  I've
>> thus pushed "[gcn] Work-around libgomp 'error: array subscript 0 is
>> outside array bounds of ‘__lds struct gomp_thread * __lds[0]’
>> [-Werror=array-bounds]' [PR101484]" to master branch in commit
>> 9f2bc5077debef2b046b6c10d38591ac324ad8b5, see attached.
>
> As I should find, these '#pragma GCC diagnostic [...]' directives cause
> some code generation changes (that seems unexpected, problematic!).
> (Martin, any idea?  Might be a pre-existing problem, of course.)

OK, phew.  Martin: your diagnostic changes are *not* to be blamed for
code generation changes -- it's my '#pragma GCC diagnostic pop'
placement that triggers:

> This
> 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:

In addition to a few in straight-line code, I also had these two:

> --- a/libgomp/libgomp.h
> +++ b/libgomp/libgomp.h
> @@ -128,7 +128,10 @@ 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,8 +159,11 @@ 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

..., and it appears that the '#pragma GCC diagnostic pop' are considered
here to be the 'statement' of the 'if'!  That's (a) unexpected (to me, at
least) for this kind of "non-executable" '#pragma', and (b) certainly
would be worth a dignostic, like we have for OMP pragmas, for example:

    if (context == pragma_stmt)
      {
        error_at (loc, "%<#pragma %s%> may only be used in compound statements",
                  "[...]");

Addressing that is for another day.


Grüße
 Thomas
-----------------
Siemens Electronic Design Automation GmbH; Anschrift: Arnulfstraße 201, 80634 
München; Gesellschaft mit beschränkter Haftung; Geschäftsführer: Thomas 
Heurung, Frank Thürauf; Sitz der Gesellschaft: München; Registergericht 
München, HRB 106955

Reply via email to