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

            Bug ID: 106447
           Summary: nvptx offloading: C++ '__iterator_category' 'return'
                    ICE
           Product: gcc
           Version: 13.0
            Status: UNCONFIRMED
          Keywords: ice-on-valid-code, openmp
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tschwinge at gcc dot gnu.org
                CC: sayle at gcc dot gnu.org, vries at gcc dot gnu.org
  Target Milestone: ---
            Target: nvptx

I found this during my "GPU support for minimal C++ library" investigations,
PR101544.  You're not currently able to reproduce this, as it depends on a
number of WIP patches, but I'm filing it for later reference.  (Or, I suppose
could maybe come up with a stand-alone reproducer.)  I've done a quick try
reproducing the issue without offloading, with a nvptx target toolchain, but
didn't succeed to trigger the ICE there.

Simple program (similar to PR106445, but using a constructor with 'count'):

    #include <vector>

    int main()
    {
      #pragma omp target
      {
        std::vector<int> v(100);
      }

      return 0;
    }

This explodes in nvptx offloading compilation:

    during RTL pass: expand
    dump file: ./a.xnvptx-none.mkoffload.254r.expand
   
[...]/build-gcc/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h:
In function ‘__iterator_category’:
   
[...]/build-gcc/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h:239:65:
internal compiler error: in emit_move_insn, at expr.cc:4039
      239 |     { return typename iterator_traits<_Iter>::iterator_category();
}
          |                                                                 ^

That's, through some layers of C++ templates,
'libstdc++-v3/include/bits/stl_iterator_base_types.h':

    235   template<typename _Iter>
    236     inline _GLIBCXX_CONSTEXPR
    237     typename iterator_traits<_Iter>::iterator_category
    238     __iterator_category(const _Iter&)
    239     { return typename iterator_traits<_Iter>::iterator_category(); }

'*.253t.optimized':

    ;; Function __iterator_category
(_ZSt19__iterator_categoryIPiENSt15iterator_traitsIT_E17iterator_categoryERKS2_,
funcdef_no=39, decl_uid=1570, cgraph_uid=40, symbol_order=223)

    __attribute__((omp declare target))
    struct iterator_category __iterator_category (int * const & D.1815)
    {
      struct iterator_category D.1816;

      <bb 2> :

      <bb 3> :
    gimple_label <<L0>>
      gimple_return <D.1816>

    }

'*.254r.expand':

    ;; Function __iterator_category
(_ZSt19__iterator_categoryIPiENSt15iterator_traitsIT_E17iterator_categoryERKS2_,
funcdef_no=39, decl_uid=1570, cgraph_uid=40, symbol_order=223)


    ;; Generating RTL for gimple basic block 2

    ;; Generating RTL for gimple basic block 3



    EMERGENCY DUMP:

    __attribute__((omp declare target))
    struct iterator_category __iterator_category (int * const & D.1815)
    { 
      int * const & _2(D);

    (note 5 1 2 4 [bb 4] NOTE_INSN_BASIC_BLOCK)
    (insn 2 5 3 4 (set (reg:DI 24)
            (unspec:DI [
                    (const_int 0 [0])
                ] UNSPEC_ARG_REG))
"[...]/build-gcc/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h":238:5
-1
         (nil))
    (insn 3 2 4 4 (set (mem/f/c:DI (reg/f:DI 17 virtual-stack-vars) [23
D.1815+0 S8 A64])
            (reg:DI 24))
"[...]/build-gcc/x86_64-pc-linux-gnu/libstdc++-v3/include/bits/stl_iterator_base_types.h":238:5
-1
         (nil))
    (note 4 3 6 4 NOTE_INSN_FUNCTION_BEG)

    (note 6 4 7 2 [bb 2] NOTE_INSN_BASIC_BLOCK)

    (code_label 7 6 8 68 (nil) [0 uses])
    (note 8 7 0 [bb 3] NOTE_INSN_BASIC_BLOCK)

    }

I'm not attaching a nvptx offloading 'lto1' reproducer, as these are somewhat
old GCC sources with local modifications, so I'm not sure the LTO stream format
would match, etc.  If someone is interested in reproducing this, we shall
coordinate.

    (gdb) bt
    #0  fancy_abort (file=file@entry=0x1927f68 "[...]/source-gcc/gcc/expr.cc",
line=line@entry=4039, function=function@entry=0x19298d8
<emit_move_insn(rtx_def*, rtx_def*)::__FUNCTION__> "emit_move_insn") at
[...]/source-gcc/gcc/diagnostic.cc:2012
    #1  0x0000000000847b3f in emit_move_insn (x=x@entry=0x7ffff7690f60,
y=y@entry=0x7ffff7690f30) at [...]/source-gcc/gcc/expr.cc:4038
    #2  0x00000000006e8119 in expand_value_return
(val=val@entry=0x7ffff7690f30) at [...]/source-gcc/gcc/cfgexpand.cc:3741
    #3  0x00000000006e85b1 in expand_return
(retval=retval@entry=0x7ffff768abe0) at [...]/source-gcc/gcc/cfgexpand.cc:3813
    #4  0x00000000006e8a1e in expand_gimple_stmt_1
(stmt=stmt@entry=0x7ffff76920f0) at [...]/source-gcc/gcc/cfgexpand.cc:3920
    #5  0x00000000006e90da in expand_gimple_stmt
(stmt=stmt@entry=0x7ffff76920f0) at [...]/source-gcc/gcc/cfgexpand.cc:4046
    #6  0x00000000006f3c88 in expand_gimple_basic_block
(bb=bb@entry=0x7ffff7687d68, disable_tail_calls=disable_tail_calls@entry=false)
at [...]/source-gcc/gcc/cfgexpand.cc:6093
    #7  0x00000000006f6378 in (anonymous namespace)::pass_expand::execute
(this=0x1f98db0, fun=0x7ffff76250b8) at [...]/source-gcc/gcc/cfgexpand.cc:6819
    [...]
    (gdb) up
    #1  0x0000000000847b3f in emit_move_insn (x=x@entry=0x7ffff7690f60,
y=y@entry=0x7ffff7690f30) at [...]/source-gcc/gcc/expr.cc:4038
    4038      gcc_assert (mode != BLKmode
    (gdb) list
    4033      machine_mode mode = GET_MODE (x);
    4034      rtx y_cst = NULL_RTX;
    4035      rtx_insn *last_insn;
    4036      rtx set;
    4037
    4038      gcc_assert (mode != BLKmode
    4039                  && (GET_MODE (y) == mode || GET_MODE (y) ==
VOIDmode));
    4040
    4041      /* If we have a copy that looks like one of the following
patterns:
    4042           (set (subreg:M1 (reg:M2 ...)) (subreg:M1 (reg:M2 ...)))
    (gdb) print mode
    $1 = E_SImode
    (gdb) print y
    $2 = (rtx) 0x7ffff7690f30
    (gdb) call debug_rtx(y)
    (reg:QI 22 [ D.1816 ])
    (gdb) call debug_rtx(x)
    (reg:SI 23 [ <retval> ])
  • [Bug target/106447] New: nv... tschwinge at gcc dot gnu.org via Gcc-bugs

Reply via email to