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> ])