Hi!

On 2021-08-20T09:51:36+0200, Richard Biener <richard.guent...@gmail.com> wrote:
> On Thu, Aug 19, 2021 at 10:14 PM Thomas Schwinge
> <tho...@codesourcery.com> wrote:
>> Richard, maybe you have an opinion here, in particular about my
>> "SLP vectorizer" comment below?  Please see
>> <87r1f2puss.fsf@euler.schwinge.homeip.net">http://mid.mail-archive.com/87r1f2puss.fsf@euler.schwinge.homeip.net>
>> for the full context.
>>
>> On 2021-08-16T10:21:04+0200, Jakub Jelinek <ja...@redhat.com> wrote:
>> > On Mon, Aug 16, 2021 at 10:08:42AM +0200, Thomas Schwinge wrote:
>> >>  /* Build COMPONENT_REF and set TREE_THIS_VOLATILE and TREE_READONLY on it
>> >>     as appropriate.  */
>> >>
>> >>  tree
>> >>  omp_build_component_ref (tree obj, tree field)
>> >>  {
>> >> +  tree field_type = TREE_TYPE (field);
>> >> +  tree obj_type = TREE_TYPE (obj);
>> >> +  if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (obj_type)))
>> >> +    field_type
>> >> +      = build_qualified_type (field_type,
>> >> +                          KEEP_QUAL_ADDR_SPACE (TYPE_QUALS (obj_type)));
>>
>> (For later reference: "Kwok's new code" here is to propagate to
>> 'field_type' any non-generic address space of 'obj_type'.)
>>
>> |> Concerning the current 'gcc/omp-low.c:omp_build_component_ref', for the
>> |> current set of offloading testcases, we never see a
>> |> '!ADDR_SPACE_GENERIC_P' there, so the address space handling doesn't seem
>> |> to be necessary there (but also won't do any harm: no-op).
>> >
>> > Are you sure this can't trigger?
>> > Say
>> > extern int __seg_fs a;
>> >
>> > void
>> > foo (void)
>> > {
>> >   #pragma omp parallel private (a)
>> >   a = 2;
>> > }
>>
>> That test case doesn't run into 'omp_build_component_ref' at all,
>> but I'm attaching an altered and extended variant that does,
>> "Add 'libgomp.c/address-space-1.c'".  OK to push to master branch?
>>
>> In this case, 'omp_build_component_ref' called via host compilation
>> 'pass_lower_omp', it's the 'field_type' that has 'address-space-1', not
>> 'obj_type', so indeed Kwok's new code is a no-op:
>>
>>     (gdb) call debug_tree(field_type)
>>      <pointer_type 0x7ffff7686b28
>>         type <integer_type 0x7ffff7686498 int address-space-1 SI
>>             size <integer_cst 0x7ffff7540f30 constant 32>
>>             unit-size <integer_cst 0x7ffff7540f48 constant 4>
>>             align:32 warn_if_not_align:0 symtab:0 alias-set -1 
>> canonical-type 0x7ffff7686498 precision:32 min <integer_cst 0x7ffff7540ee8 
>> -2147483648> max <integer_cst 0x7ffff7540f00 2147483647>
>>             pointer_to_this <pointer_type 0x7ffff7686b28>>
>>         unsigned DI
>>         size <integer_cst 0x7ffff7540cf0 type <integer_type 0x7ffff75590a8 
>> bitsizetype> constant 64>
>>         unit-size <integer_cst 0x7ffff7540d08 type <integer_type 
>> 0x7ffff7559000 sizetype> constant 8>
>>         align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
>> 0x7ffff7686b28>
>>
>>     (gdb) call debug_tree(obj_type)
>>      <record_type 0x7ffff7686bd0 .omp_data_t.0 readonly DI
>>         size <integer_cst 0x7ffff7540cf0 type <integer_type 0x7ffff75590a8 
>> bitsizetype> constant 64>
>>         unit-size <integer_cst 0x7ffff7540d08 type <integer_type 
>> 0x7ffff7559000 sizetype> constant 8>
>>         align:64 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
>> 0x7ffff7686bd0
>>         fields <field_decl 0x7ffff7568428 a
>>             type <pointer_type 0x7ffff7686b28 type <integer_type 
>> 0x7ffff7686498 int address-space-1>
>>                 unsigned DI size <integer_cst 0x7ffff7540cf0 64> unit-size 
>> <integer_cst 0x7ffff7540d08 8>
>>                 align:64 warn_if_not_align:0 symtab:0 alias-set -1 
>> canonical-type 0x7ffff7686b28>
>>             unsigned DI /home/thomas/shared/gcc/omp/as.c:4:14 size 
>> <integer_cst 0x7ffff7540cf0 64> unit-size <integer_cst 0x7ffff7540d08 8>
>>             align:64 warn_if_not_align:0 offset_align 128
>>             offset <integer_cst 0x7ffff7540d20 constant 0>
>>             bit-offset <integer_cst 0x7ffff7540d68 constant 0> context 
>> <record_type 0x7ffff7686540 .omp_data_t.0>> reference_to_this 
>> <reference_type 0x7ffff7686c78>>
>>
>> The case that Kwok's new code handles, however, is when 'obj_type' has a
>> non-generic address space, and then propagates that one to 'field_type'.
>>
>> For a similar OpenACC example, 'omp_build_component_ref' called via GCN
>> offloading compilation 'pass_omp_oacc_neuter_broadcast', we've got
>> without Kwok's new code:
>>
>>     (gdb) call debug_tree(field_type)
>>      <boolean_type 0x7ffff7550b28 bool public unsigned QI
>>         size <integer_cst 0x7ffff754fa80 type <integer_type 0x7ffff75500a8 
>> bitsizetype> constant 8>
>>         unit-size <integer_cst 0x7ffff754fa98 type <integer_type 
>> 0x7ffff7550000 sizetype> constant 1>
>>         align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
>> 0x7ffff7550b28 precision:1 min <integer_cst 0x7ffff754fcd8 0> max 
>> <integer_cst 0x7ffff754fd08 1>>
>>
>>     (gdb) call debug_tree(obj_type)
>>      <record_type 0x7ffff7631000 .oacc_ws_data_s.0 address-space-4 QI
>>         size <integer_cst 0x7ffff754fa80 type <integer_type 0x7ffff75500a8 
>> bitsizetype> constant 8>
>>         unit-size <integer_cst 0x7ffff754fa98 type <integer_type 
>> 0x7ffff7550000 sizetype> constant 1>
>>         align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
>> 0x7ffff7631000
>>         fields <field_decl 0x7ffff762e260 _52
>>             type <boolean_type 0x7ffff7550b28 bool public unsigned QI size 
>> <integer_cst 0x7ffff754fa80 8> unit-size <integer_cst 0x7ffff754fa98 1>
>>                 align:8 warn_if_not_align:0 symtab:0 alias-set -1 
>> canonical-type 0x7ffff7550b28 precision:1 min <integer_cst 0x7ffff754fcd8 0> 
>> max <integer_cst 0x7ffff754fd08 1>>
>>             unsigned QI <built-in>:0:0 size <integer_cst 0x7ffff754fa80 8> 
>> unit-size <integer_cst 0x7ffff754fa98 1>
>>             align:8 warn_if_not_align:0 offset_align 64
>>             offset <integer_cst 0x7ffff754f9c0 constant 0>
>>             bit-offset <integer_cst 0x7ffff754fa08 constant 0> context 
>> <record_type 0x7ffff7631000 .oacc_ws_data_s.0 address-space-4>>
>>         pointer_to_this <pointer_type 0x7ffff7631498>>
>>
>> ..., and with Kwok's new code the 'address-space-4' of 'obj_type' is
>> propagated to 'field_type':
>>
>>     (gdb) call debug_tree(field_type)
>>      <boolean_type 0x7ffff7631540 bool address-space-4 unsigned QI
>>         size <integer_cst 0x7ffff754fa80 type <integer_type 0x7ffff75500a8 
>> bitsizetype> constant 8>
>>         unit-size <integer_cst 0x7ffff754fa98 type <integer_type 
>> 0x7ffff7550000 sizetype> constant 1>
>>         align:8 warn_if_not_align:0 symtab:0 alias-set -1 canonical-type 
>> 0x7ffff7631540 precision:1 min <integer_cst 0x7ffff754fcd8 0> max 
>> <integer_cst 0x7ffff754fd08 1>>
>>
>> I'm not familiar enough with these bits to tell whether Kwok's new code
>> is the right solution to this problem -- or if, for example, the problem
>> is rather in the SLP vectorizer, where the ICE seems to ultimately
>> emerge?
>>
>> Without (ICEs later) vs. with (works) Kwok's new code, we see the
>> 'a.xamdgcn-amdhsa.mkoffload.175t.slp1' dump change as follows (word-diff,
>> only additional '<address-space-4>', occasionally):
>>
>>     [...]
>>       {+<address-space-4>+} vector(2) long int * vectp.58;
>>       {+<address-space-4>+} vector(2) long int * vectp_.oacc_worker_o.57;
>>       {+<address-space-4>+} vector(2) int * vectp.56;
>>       {+<address-space-4>+} vector(2) int * vectp_.oacc_worker_o.55;
>>     [...]
>>       {+<address-space-4>+} long int * _104;
>>     [...]
>>       {+<address-space-4>+} long int * _108;
>>     [...]
>>       <address-space-4> void * _350;
>>     [...]
>>       _350 = __builtin_gcn_single_copy_start (&.oacc_worker_o.6);
>>     [...]
>>       MEM <{+<address-space-4>+} vector(2) long int> [(long int 
>> *)&.oacc_worker_o.6] = _101;
>>       _108 = &.oacc_worker_o.6._22 + 16;
>>       MEM <{+<address-space-4>+} vector(2) long int> [(long int *)_108] = 
>> _100;
>>       _104 = &.oacc_worker_o.6._22 + 32;
>>     [...]
>>
>> For example, with Kwok's new code, '_108' ('<address-space-4> long int *')
>> is cast into '(long int *)' -- presumably synthesized in the SLP
>> vectorizer?  Is that correct or shouldn't that cast also include
>> '<address-space-4>'?
>>
>> I see a similar issue has been fixed a while ago: r245772 (Git commit
>> c7d97b2846c5647a81548caa3264d77c0a595010) for PR79723
>> "Another case of dropped gs: prefix", changing
>> 'gcc/tree-vect-stmts.c:get_vectype_for_scalar_type_and_size' as follows:
>>
>>     +  /* Re-attach the address-space qualifier if we canonicalized the 
>> scalar
>>     +     type.  */
>>     +  if (TYPE_ADDR_SPACE (orig_scalar_type) != TYPE_ADDR_SPACE (vectype))
>>     +    return build_qualified_type
>>     +            (vectype, KEEP_QUAL_ADDR_SPACE (TYPE_QUALS 
>> (orig_scalar_type)));
>>     +
>>        return vectype;
>>
>> (It looks a bit like the address space handling is quite fragile in GCC's
>> 'tree' types/interfaces?  Do we have ideas about how to make that more
>> robust, less "bolt-on"?)
>
> If in doubt always look at what RTL expansion does - it looks like
> set_mem_attributes expects the address-space qualifier to be
> present on the type or in case it is passed an object, on the
> type of the base, or in case of a dereference, on the pointed-to
> type of the pointer (and yes, that does look somewhat fragile).
>
> So it looks like the patch you refer to shouldn't fix anything and
>
>>     +  /* Re-attach the address-space qualifier if we canonicalized the 
>> scalar
>>     +     type.  */
>>     +  if (TYPE_ADDR_SPACE (orig_scalar_type) != TYPE_ADDR_SPACE (vectype))
>>     +    return build_qualified_type
>>     +            (vectype, KEEP_QUAL_ADDR_SPACE (TYPE_QUALS 
>> (orig_scalar_type)));
>
> looks incomplete.  What you'd need to look for is MEM_REFs built
> by the vectorizer and the address-space information on the pointers,
> like generated from vect_create_data_ref_ptr.  It might also be that
> data-ref analysis / SCEV looks through address-space qualifier changing
> casts and thus we pick up the wrong address-space in the end.

Aah, more GCC pieces to learn about ;-) -- thanks for the pointers!

> What's the testcase that ICEs on trunk?

You'll need a GCN offloading build with the attached
"[WIP] Reproduce GCN address space vs. SLP vectorization ICEs",
run 'make check-target-libgomp', and observe a number of ICEs like:

    during RTL pass: expand
    [...]/libgomp.oacc-c-c++-common/loop-red-gwv-1.c: In function 
'main._omp_fn.0':
    [...]/libgomp.oacc-c-c++-common/loop-red-gwv-1.c:19:9: internal compiler 
error: in convert_memory_address_addr_space_1, at explow.c:301
    [...]
    mkoffload: fatal error: 
build-gcc/gcc/x86_64-pc-linux-gnu-accel-amdgcn-amdhsa-gcc returned 1 exit status

'-O1 -ftree-slp-vectorize' would be sufficient to trigger that one.
Run with '-save-temps -v', see the
'[...]/build-gcc-offload-amdgcn-amdhsa/gcc/lto1' command ICE:

    #0  fancy_abort (file=file@entry=0x182e418 "[...]/source-gcc/gcc/explow.c", 
line=line@entry=301, function=function@entry=0x182e960 
<convert_memory_address_addr_space_1(scalar_int_mode, rtx_def*, unsigned char, 
bool, bool)::__FUNCTION__> "convert_memory_address_addr_space_1") at 
[...]/source-gcc/gcc/diagnostic.c:1961
    #1  0x00000000007ef690 in convert_memory_address_addr_space_1 (to_mode=..., 
x=x@entry=0x7ffff764fa08, as=as@entry=0 '\000', in_const=in_const@entry=false, 
no_emit=no_emit@entry=false) at [...]/source-gcc/gcc/explow.c:301
    #2  0x00000000007ef6cb in convert_memory_address_addr_space (to_mode=..., 
x=0x7ffff764fa08, as=as@entry=0 '\000') at [...]/source-gcc/gcc/explow.c:423
    #3  0x0000000000812f48 in expand_expr_addr_expr (modifier=EXPAND_SUM, 
tmode=E_DImode, target=0x0, exp=0x7ffff764a520) at 
[...]/source-gcc/gcc/expr.c:8535
    #4  expand_expr_real_1 (exp=0x7ffff764a520, target=<optimized out>, 
tmode=<optimized out>, modifier=EXPAND_SUM, alt_rtl=0x0, 
inner_reference_p=<optimized out>) at [...]/source-gcc/gcc/expr.c:11741
    #5  0x0000000000813139 in expand_expr (modifier=EXPAND_SUM, 
mode=E_VOIDmode, target=0x0, exp=0x7ffff764a520) at 
[...]/source-gcc/gcc/expr.h:301
    #6  expand_expr_real_1 (exp=0x7ffff7649d48, target=<optimized out>, 
tmode=E_VOIDmode, modifier=EXPAND_WRITE, alt_rtl=0x0, 
inner_reference_p=<optimized out>) at [...]/source-gcc/gcc/expr.c:10887
    #7  0x000000000082475a in expand_expr (modifier=EXPAND_WRITE, 
mode=E_VOIDmode, target=0x0, exp=0x7ffff7649d48) at 
[...]/source-gcc/gcc/expr.h:301
    #8  expand_assignment (to=to@entry=0x7ffff7649d48, 
from=from@entry=0x7ffff763a7e0, nontemporal=<optimized out>) at 
[...]/source-gcc/gcc/expr.c:5732
    #9  0x00000000006c807d in expand_gimple_stmt_1 
(stmt=stmt@entry=0x7ffff7646aa0) at [...]/source-gcc/gcc/cfgexpand.c:3944
    #10 0x00000000006c95c7 in expand_gimple_stmt 
(stmt=stmt@entry=0x7ffff7646aa0) at [...]/source-gcc/gcc/cfgexpand.c:4040
    #11 0x00000000006ce884 in expand_gimple_basic_block (bb=0x7ffff7635dd0, 
disable_tail_calls=disable_tail_calls@entry=false) at 
[...]/source-gcc/gcc/cfgexpand.c:6082
    #12 0x00000000006d13de in (anonymous namespace)::pass_expand::execute 
(this=<optimized out>, fun=<optimized out>) at 
[...]/source-gcc/gcc/cfgexpand.c:6808
    [...]
    (gdb) up
    #1  0x00000000007ef690 in convert_memory_address_addr_space_1 (to_mode=..., 
x=x@entry=0x7ffff764fa08, as=as@entry=0 '\000', in_const=in_const@entry=false, 
no_emit=no_emit@entry=false) at [...]/source-gcc/gcc/explow.c:301
    301       gcc_assert (GET_MODE (x) == to_mode || GET_MODE (x) == VOIDmode);
    (gdb) list
    296                                          rtx x, addr_space_t as 
ATTRIBUTE_UNUSED,
    297                                          bool in_const ATTRIBUTE_UNUSED,
    298                                          bool no_emit ATTRIBUTE_UNUSED)
    299     {
    300     #ifndef POINTERS_EXTEND_UNSIGNED
    301       gcc_assert (GET_MODE (x) == to_mode || GET_MODE (x) == VOIDmode);
    302       return x;
    303     #else /* defined(POINTERS_EXTEND_UNSIGNED) */
    304       scalar_int_mode pointer_mode, address_mode, from_mode;
    305       rtx temp;
    (gdb) call debug_rtx(x)
    (symbol_ref:SI (".oacc_worker_o.13.6") [flags 0x2] <var_decl 0x7ffff7637d80 
.oacc_worker_o.13>)
    (gdb) print x->mode
    $1 = E_SImode
    (gdb) print to_mode
    $2 = {m_mode = E_DImode}
    (gdb) up
    #2  0x00000000007ef6cb in convert_memory_address_addr_space (to_mode=..., 
x=0x7ffff764fa08, as=as@entry=0 '\000') at [...]/source-gcc/gcc/explow.c:423
    423       return convert_memory_address_addr_space_1 (to_mode, x, as, 
false, false);
    (gdb) up
    #3  0x0000000000812f48 in expand_expr_addr_expr (modifier=EXPAND_SUM, 
tmode=E_DImode, target=0x0, exp=0x7ffff764a520) at 
[...]/source-gcc/gcc/expr.c:8535
    8535        result = convert_memory_address_addr_space (new_tmode, result, 
as);
    (gdb) call debug_tree(exp)
     <addr_expr 0x7ffff764a520
        type <pointer_type 0x7ffff7557888
            type <integer_type 0x7ffff75505e8 int public SI
                size <integer_cst 0x7ffff754fbd0 constant 32>
                unit-size <integer_cst 0x7ffff754fbe8 constant 4>
                align:32 warn_if_not_align:0 symtab:0 alias-set 4 
canonical-type 0x7ffff75505e8 precision:32 min <integer_cst 0x7ffff754fb88 
-2147483648> max <integer_cst 0x7ffff754fba0 2147483647>
                pointer_to_this <pointer_type 0x7ffff7557888>>
            public unsigned DI
            size <integer_cst 0x7ffff754f990 constant 64>
            unit-size <integer_cst 0x7ffff754f9a8 constant 8>
            align:64 warn_if_not_align:0 symtab:0 alias-set 1 
structural-equality>
        constant
        arg:0 <var_decl 0x7ffff7637d80 .oacc_worker_o.13
            type <record_type 0x7ffff76215e8 .oacc_ws_data_s.0 address-space-4 
no-force-blk BLK size <integer_cst 0x7ffff754f990 64> unit-size <integer_cst 
0x7ffff754f9a8 8>
                align:32 warn_if_not_align:0 symtab:0 alias-set 5 
canonical-type 0x7ffff76215e8 fields <field_decl 0x7ffff76317b8 t>
                pointer_to_this <pointer_type 0x7ffff76219d8>>
            addressable used static ignored BLK 
source-gcc/libgomp/testsuite/libgomp.oacc-c-c++-common/loop-red-gwv-1.c:19:9 
size <integer_cst 0x7ffff754f990 64> unit-size <integer_cst 0x7ffff754f9a8 8>
            align:128 warn_if_not_align:0
            (mem/c:BLK (symbol_ref:SI (".oacc_worker_o.13.6") [flags 0x2] 
<var_decl 0x7ffff7637d80 .oacc_worker_o.13>) [5 .oacc_worker_o.13+0 S8 A128 
AS4])>>

In 'arg:0' of 'exp' note 'address-space-4' (expected): 'ADDR_SPACE_LDS'
(per 'gcc/config/gcn/gcn.h:gcn_address_spaces').


With the attached "[WIP] [GCN] '+#define POINTERS_EXTEND_UNSIGNED 1'", we
instead fail as follows:

    ./a.xamdgcn-amdhsa.mkoffload.2.s:92:23: error: invalid modifier 'rel32@lo' 
(no symbols present)
            s_add_u32       s2, s2, 32@rel32@lo+4
                                       ^
    ./a.xamdgcn-amdhsa.mkoffload.2.s:92:23: error: failed parsing operand.
            s_add_u32       s2, s2, 32@rel32@lo+4
                                       ^
    ./a.xamdgcn-amdhsa.mkoffload.2.s:93:24: error: invalid modifier 'rel32@hi' 
(no symbols present)
            s_addc_u32      s3, s3, 32@rel32@hi+4
                                       ^
    ./a.xamdgcn-amdhsa.mkoffload.2.s:93:24: error: failed parsing operand.
            s_addc_u32      s3, s3, 32@rel32@hi+4
                                       ^
    mkoffload: fatal error: 
build-gcc/gcc/x86_64-pc-linux-gnu-accel-amdgcn-amdhsa-gcc returned 1 exit status

..., so it's not that simple.  (I have no clue whether
'POINTERS_EXTEND_UNSIGNED' would make sense for GCN -- but thought it was
worth a quick try.)


Grüße
 Thomas


>> I did add a few 'assert's for non-generic address space to
>> 'gcc/tree-vect*', but have not yet located where things may be going
>> wrong.
>>
>>
>> > I think keeping the qual addr space here is the wrong thing to do,
>> > it should keep the other quals and clear the address space instead,
>> > the whole struct is going to be in generic addres space, isn't it?
>>
>> Correct for 'omp_build_component_ref' called via host compilation
>> 'pass_lower_omp', but in the case of 'omp_build_component_ref' called via
>> GCN offloading compilation 'pass_omp_oacc_neuter_broadcast', 'obj_type'
>> has a non-generic address space.
>>
>> However, regarding the former comment -- shouldn't we force generic
>> address space for all 'tree' types read in via LTO streaming for
>> offloading compilation?  I assume that (in the general case) address
>> spaces are never compatible between host and offloading compilation?
>> For the attached "Add 'libgomp.c/address-space-1.c'", propagating the
>> '__seg_fs' address space across the offloading boundary (assuming I did
>> interpret the dumps correctly) doesn't seem to cause any problems, but
>> maybe it's problematic for other cases?  (This is, however, a separate
>> issue from what I'm discussing here.)
>>
>>
>> >> +  tree ret = build3 (COMPONENT_REF, field_type, obj, field, NULL);
>> >> +  if (TREE_THIS_VOLATILE (field))
>> >> +    TREE_THIS_VOLATILE (ret) |= 1;
>> >> +  if (TREE_READONLY (field))
>> >> +    TREE_READONLY (ret) |= 1;
>> >
>> > When touching these two, shouldn't it be better written as
>> > = 1; instead of |= 1; ?  For a bitfield...
>>
>> Yes, that was just copied from the original
>> 'gcc/omp-general.c:omp_build_component_ref' -- but happy to simplify
>> that, of course.
>>
>>
>> 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


-----------------
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
>From eedea7a1041720ac4da9938716145c02918dd45e Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <tho...@codesourcery.com>
Date: Fri, 20 Aug 2021 12:36:25 +0200
Subject: [PATCH] [WIP] Reproduce GCN address space vs. SLP vectorization ICEs

---
 gcc/omp-oacc-neuter-broadcast.cc                   |  2 ++
 libgomp/testsuite/libgomp.c++/c++.exp              |  3 +++
 libgomp/testsuite/libgomp.c/c.exp                  |  3 +++
 libgomp/testsuite/libgomp.fortran/fortran.exp      |  3 +++
 libgomp/testsuite/libgomp.graphite/graphite.exp    |  3 +++
 libgomp/testsuite/libgomp.oacc-c++/c++.exp         | 11 +++++++++++
 libgomp/testsuite/libgomp.oacc-c/c.exp             | 11 +++++++++++
 libgomp/testsuite/libgomp.oacc-fortran/fortran.exp | 11 +++++++++++
 8 files changed, 47 insertions(+)

diff --git a/gcc/omp-oacc-neuter-broadcast.cc b/gcc/omp-oacc-neuter-broadcast.cc
index d48627a6940..12b4d004c71 100644
--- a/gcc/omp-oacc-neuter-broadcast.cc
+++ b/gcc/omp-oacc-neuter-broadcast.cc
@@ -942,10 +942,12 @@ oacc_build_component_ref (tree obj, tree field)
 {
   tree field_type = TREE_TYPE (field);
   tree obj_type = TREE_TYPE (obj);
+#if 0 // thus, 'oacc_build_component_ref' == 'gcc/omp-low.c:omp_build_component_ref'
   if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (obj_type)))
     field_type = build_qualified_type
 			(field_type,
 			 KEEP_QUAL_ADDR_SPACE (TYPE_QUALS (obj_type)));
+#endif
 
   tree ret = build3 (COMPONENT_REF, field_type, obj, field, NULL);
   if (TREE_THIS_VOLATILE (field))
diff --git a/libgomp/testsuite/libgomp.c++/c++.exp b/libgomp/testsuite/libgomp.c++/c++.exp
index f4884e2ffa7..50448544084 100644
--- a/libgomp/testsuite/libgomp.c++/c++.exp
+++ b/libgomp/testsuite/libgomp.c++/c++.exp
@@ -1,3 +1,6 @@
+#TODO
+return
+
 load_lib libgomp-dg.exp
 load_gcc_lib gcc-dg.exp
 
diff --git a/libgomp/testsuite/libgomp.c/c.exp b/libgomp/testsuite/libgomp.c/c.exp
index 31bdd5795dc..a440a4c35b6 100644
--- a/libgomp/testsuite/libgomp.c/c.exp
+++ b/libgomp/testsuite/libgomp.c/c.exp
@@ -1,3 +1,6 @@
+#TODO
+return
+
 if [info exists lang_library_path] then {
     unset lang_library_path
     unset lang_link_flags
diff --git a/libgomp/testsuite/libgomp.fortran/fortran.exp b/libgomp/testsuite/libgomp.fortran/fortran.exp
index eb701311b6a..d7dea846afa 100644
--- a/libgomp/testsuite/libgomp.fortran/fortran.exp
+++ b/libgomp/testsuite/libgomp.fortran/fortran.exp
@@ -1,3 +1,6 @@
+#TODO
+return
+
 load_lib libgomp-dg.exp
 load_gcc_lib gcc-dg.exp
 load_gcc_lib gfortran-dg.exp
diff --git a/libgomp/testsuite/libgomp.graphite/graphite.exp b/libgomp/testsuite/libgomp.graphite/graphite.exp
index 4b01222bbc4..0d12a8323bf 100644
--- a/libgomp/testsuite/libgomp.graphite/graphite.exp
+++ b/libgomp/testsuite/libgomp.graphite/graphite.exp
@@ -1,3 +1,6 @@
+#TODO
+return
+
 #   Copyright (C) 2009-2021 Free Software Foundation, Inc.
 
 # This program is free software; you can redistribute it and/or modify
diff --git a/libgomp/testsuite/libgomp.oacc-c++/c++.exp b/libgomp/testsuite/libgomp.oacc-c++/c++.exp
index 42e0395f9a5..f5cd9ff7513 100644
--- a/libgomp/testsuite/libgomp.oacc-c++/c++.exp
+++ b/libgomp/testsuite/libgomp.oacc-c++/c++.exp
@@ -89,9 +89,15 @@ if { $lang_test_file_found } {
 		continue
 	    }
 	    host {
+		#TODO
+		continue
+
 		set acc_mem_shared 1
 	    }
 	    nvidia {
+		#TODO
+		continue
+
 		if { ![check_effective_target_openacc_nvidia_accel_present] } {
 		    # Don't bother; execution testing is going to FAIL.
 		    untested "$subdir $offload_target offloading: supported, but hardware not accessible"
@@ -107,11 +113,14 @@ if { $lang_test_file_found } {
 		set acc_mem_shared 0
 	    }
 	    radeon {
+		#TODO
+		if { 0 } {
 		if { ![check_effective_target_openacc_radeon_accel_present] } {
 		    # Don't bother; execution testing is going to FAIL.
 		    untested "$subdir $offload_target offloading: supported, but hardware not accessible"
 		    continue
 		}
+		}
 
 		set acc_mem_shared 0
 	    }
@@ -144,6 +153,8 @@ if { $lang_test_file_found } {
 		set-torture-options [list \
 					 { -O0 } \
 					 { -O2 } ]
+		#TODO
+		set-torture-options [list { -O2 -ftree-slp-vectorize } ]
 	    }
 	}
 
diff --git a/libgomp/testsuite/libgomp.oacc-c/c.exp b/libgomp/testsuite/libgomp.oacc-c/c.exp
index 4bb2b2ac494..dd621568d2b 100644
--- a/libgomp/testsuite/libgomp.oacc-c/c.exp
+++ b/libgomp/testsuite/libgomp.oacc-c/c.exp
@@ -52,9 +52,15 @@ foreach offload_target [concat [split $offload_targets ","] "disable"] {
 	    continue
 	}
 	host {
+	    #TODO
+	    continue
+
 	    set acc_mem_shared 1
 	}
 	nvidia {
+	    #TODO
+	    continue
+
 	    if { ![check_effective_target_openacc_nvidia_accel_present] } {
 		# Don't bother; execution testing is going to FAIL.
 		untested "$subdir $offload_target offloading: supported, but hardware not accessible"
@@ -70,11 +76,14 @@ foreach offload_target [concat [split $offload_targets ","] "disable"] {
 	    set acc_mem_shared 0
 	}
 	radeon {
+	    #TODO
+	    if { 0 } {
 	    if { ![check_effective_target_openacc_radeon_accel_present] } {
 		# Don't bother; execution testing is going to FAIL.
 		untested "$subdir $offload_target offloading: supported, but hardware not accessible"
 		continue
 	    }
+	    }
 
 	    set acc_mem_shared 0
 	}
@@ -107,6 +116,8 @@ foreach offload_target [concat [split $offload_targets ","] "disable"] {
 	    set-torture-options [list \
 				     { -O0 } \
 				     { -O2 } ]
+	    #TODO
+	    set-torture-options [list { -O2 -ftree-slp-vectorize } ]
 	}
     }
 
diff --git a/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp b/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
index 7365b320668..85e5eb6f9d0 100644
--- a/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
+++ b/libgomp/testsuite/libgomp.oacc-fortran/fortran.exp
@@ -83,9 +83,15 @@ if { $lang_test_file_found } {
 		continue
 	    }
 	    host {
+		#TODO
+		continue
+
 		set acc_mem_shared 1
 	    }
 	    nvidia {
+		#TODO
+		continue
+
 		if { ![check_effective_target_openacc_nvidia_accel_present] } {
 		    # Don't bother; execution testing is going to FAIL.
 		    untested "$subdir $offload_target offloading: supported, but hardware not accessible"
@@ -95,11 +101,14 @@ if { $lang_test_file_found } {
 		set acc_mem_shared 0
 	    }
 	    radeon {
+		#TODO
+		if { 0 } {
 		if { ![check_effective_target_openacc_radeon_accel_present] } {
 		    # Don't bother; execution testing is going to FAIL.
 		    untested "$subdir $offload_target offloading: supported, but hardware not accessible"
 		    continue
 		}
+		}
 
 		set acc_mem_shared 0
 	    }
@@ -119,6 +128,8 @@ if { $lang_test_file_found } {
 	# For Fortran we're doing torture testing, as Fortran has far more tests
 	# with arrays etc. that testing just -O0 or -O2 is insufficient, that is
 	# typically not the case for C/C++.
+	#TODO
+	set-torture-options [list { -O2 -ftree-slp-vectorize } ]
 	gfortran-dg-runtest $tests "$tagopt" ""
     }
     unset offload_target
-- 
2.25.1

>From 2c99df97a60970f9d853aacc80a1485ad6f07052 Mon Sep 17 00:00:00 2001
From: Thomas Schwinge <tho...@codesourcery.com>
Date: Fri, 20 Aug 2021 10:50:46 +0200
Subject: [PATCH] [WIP] [GCN] '+#define POINTERS_EXTEND_UNSIGNED 1'

Doesn't change libgomp.oacc compile-time results.
  TODO But not yet execution-tested.

Without 'gcn_addr_space_valid_pointer_mode', that runs into ICEs during libgomp build (only? -- because of '__lds' usage, I suppose?):

    /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/libgomp/config/gcn/../../task.c:2408:1: internal compiler error: in convert_debug_memory_address, at cfgexpand.c:4256
     2408 | omp_in_final (void)
          | ^~~~~~~~~~~~
    0x7d64de ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:4256
    0x7e04b8 ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:4701
    0x7df2ba ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:5305
    0x7de3fc ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:4489
    0x7df2ba ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:5305
    0x7ecb0d ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:5642
    0xc5110f ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/passes.c:2567
    0xc51a77 ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/passes.c:2656
    0xc51ad4 ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/passes.c:2667
    0x8359ec ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cgraphunit.c:1828
    0x8371fc ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cgraphunit.c:1992
    0x83a99d ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cgraphunit.c:2269
    0xd5bcaf ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/toplev.c:483
    0x6305cd ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/toplev.c:2233
    0x6331c6 ???
            /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/main.c:39

Etc.

That's:

    gcc_assert (targetm.addr_space.valid_pointer_mode (mode, as));

... which (assumedly) is 'default_addr_space_valid_pointer_mode':

    return targetm.valid_pointer_mode (mode);

... which (assumedly) is 'default_valid_pointer_mode':

    return (mode == ptr_mode || mode == Pmode);

    #1  0x00000000007d64df in convert_debug_memory_address (mode=..., x=x@entry=0x7ffff75464d0, as=as@entry=4 '\004') at /home/thomas/tmp/source/gcc/build/queue-slim-omp/source-gcc/gcc/cfgexpand.c:4256
    4256      gcc_assert (targetm.addr_space.valid_pointer_mode (mode, as));
    (gdb) print mode
    $1 = {m_mode = E_SImode}
    (gdb) print as
    $2 = 4 '\004'
---
 gcc/config/gcn/gcn.c | 18 ++++++++++++++++++
 gcc/config/gcn/gcn.h |  2 ++
 2 files changed, 20 insertions(+)

diff --git a/gcc/config/gcn/gcn.c b/gcc/config/gcn/gcn.c
index f2612803dac..9d7a6a2679a 100644
--- a/gcc/config/gcn/gcn.c
+++ b/gcc/config/gcn/gcn.c
@@ -1528,6 +1528,22 @@ gcn_addr_space_debug (addr_space_t as)
   gcc_unreachable ();
 }
 
+/* TODO */
+
+static bool
+gcn_addr_space_valid_pointer_mode (scalar_int_mode mode,
+				   addr_space_t as)
+{
+#if 1
+  if (as == ADDR_SPACE_LDS)
+    return mode == SImode;
+  else
+    return default_addr_space_valid_pointer_mode (mode, as);
+#else //TODO
+  return mode == gcn_addr_space_pointer_mode (as);
+#endif
+}
+
 
 /* Implement REGNO_MODE_CODE_OK_FOR_BASE_P via gcn.h
    
@@ -6452,6 +6468,8 @@ gcn_dwarf_register_span (rtx rtl)
 #define TARGET_ADDR_SPACE_SUBSET_P gcn_addr_space_subset_p
 #undef  TARGET_ADDR_SPACE_CONVERT
 #define TARGET_ADDR_SPACE_CONVERT gcn_addr_space_convert
+#undef  TARGET_ADDR_SPACE_VALID_POINTER_MODE
+#define TARGET_ADDR_SPACE_VALID_POINTER_MODE gcn_addr_space_valid_pointer_mode
 #undef  TARGET_ARG_PARTIAL_BYTES
 #define TARGET_ARG_PARTIAL_BYTES gcn_arg_partial_bytes
 #undef  TARGET_ASM_ALIGNED_DI_OP
diff --git a/gcc/config/gcn/gcn.h b/gcc/config/gcn/gcn.h
index 5822ec34aa7..c0bd5565a49 100644
--- a/gcc/config/gcn/gcn.h
+++ b/gcc/config/gcn/gcn.h
@@ -66,6 +66,8 @@
 #define CASE_VECTOR_MODE     DImode
 #define FUNCTION_MODE	     QImode
 
+#define POINTERS_EXTEND_UNSIGNED 1
+
 #define DATA_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 128 ? (ALIGN) : 128)
 #define LOCAL_ALIGNMENT(TYPE,ALIGN) ((ALIGN) > 64 ? (ALIGN) : 64)
 #define STACK_SLOT_ALIGNMENT(TYPE,MODE,ALIGN) ((ALIGN) > 64 ? (ALIGN) : 64)
-- 
2.25.1

Reply via email to