https://gcc.gnu.org/bugzilla/show_bug.cgi?id=92029

--- Comment #1 from Tobias Burnus <burnus at gcc dot gnu.org> ---
In particular, it happens for in nvptx-none/lto1 for:

 <var_decl 0x7ffff7ff8090 A.0
    type <array_type 0x7ffff73c1b28
...
    attributes <tree_list 0x7ffff73eb4b0
        purpose <identifier_node 0x7ffff73eb488 omp declare target>> initial
<error_mark 0x7ffff731c420>>


In symtab_node::get () – as called in "varpool_node::get
(var_decl)->force_output = 1;" - one has:
437         return decl->decl_with_vis.symtab_node;
and this returns NULL.

The core code Fortran code is (with: "integer :: v(4), i"):
  !$omp target map(from:v)
    v(:) = (/ (i, i=1,4) /)
  !$omp end target

omplower dump has:

        .omp_data_arr.6.v = &v;
        #pragma omp target num_teams(1) thread_limit(0) map(from:v [len: 16])
[child fn: MAIN__._omp_fn.0 (.omp_data_arr.6, .omp_data_sizes.7,
.omp_data_kinds.8)]
          {
            .omp_data_i = (const struct .omp_data_t.5 & restrict)
&.omp_data_arr.6;
            {
              static integer(kind=4) A.0[4] = {1, 2, 3, 4};

              D.3933 = .omp_data_i->v;
              D.3934 = D.3933;
              D.3935 = MEM <uint128_t> [(c_char * {ref-all})&A.0];
              MEM <uint128_t> [(c_char * {ref-all})D.3934] = D.3935;
            }
            #pragma omp return
          }
        .omp_data_arr.6 = {CLOBBER};


In the optimized dump for MAIN__._omp_fn.0, one has – with -O0:
integer(kind=4) A.0[4];
…
_3 = .omp_data_i_2(D)->v;
_4 = _3;
_5 = MEM <uint128_t> [(c_char * {ref-all})&A.0];
MEM <uint128_t> [(c_char * {ref-all})_4] = _5;

And with -Og (which ICEs):
   _3 = .omp_data_i_2(D)->v;
   MEM <uint128_t> [(c_char * {ref-all})_3] = 0x4000000030000000200000001;

Reply via email to