https://gcc.gnu.org/bugzilla/show_bug.cgi?id=96394
Bug ID: 96394 Summary: internal compiler error: in add_new_edges_to_heap, at ipa-inline.c:1746 (-O3 PGO) Product: gcc Version: 10.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: ipa Assignee: unassigned at gcc dot gnu.org Reporter: slyfox at gcc dot gnu.org CC: marxin at gcc dot gnu.org Target Milestone: --- It's a forward of https://bugs.gentoo.org/734006 where Ștefan Talpalaru found an ICE when gcc tries to build PGO-optimised variant of python tauthon-2.8.2. I can consistently reproduce the crash on gcc-10.2.0 and was able to extract the backtrace from -O0 ggdb3 gcc: $ ${HOME}/dev/git/gcc-10-build/gcc/xgcc -B${HOME}/dev/git/gcc-10-build/gcc -pthread -fPIC -fno-strict-aliasing -O3 -frecord-gcc-switches -fwrapv -DNDEBUG -fprofile-use -fprofile-correction -I. -I/tmp/portage/dev-lang/tauthon-2.8.2/work/tauthon-2.8.2/Include -I/tmp/portage/dev-lang/tauthon-2.8.2/work/x86_64-pc-linux-gnu -c /tmp/portage/dev-lang/tauthon-2.8.2/work/tauthon-2.8.2/Modules/parsermodule.c -o build/temp.linux-x86_64-2.8/tmp/portage/dev-lang/tauthon-2.8.2/work/tauthon-2.8.2/Modules/parsermodule.o -v -fdump-ipa-all-slim Breakpoint 2, internal_error (gmsgid=0x297d49f "in %s, at %s:%d") at ../../gcc-10/gcc/diagnostic.c:1706 1706 { (gdb) bt #0 internal_error (gmsgid=0x297d49f "in %s, at %s:%d") at ../../gcc-10/gcc/diagnostic.c:1706 #1 0x0000000002063d64 in fancy_abort (file=0x2912678 "../../gcc-10/gcc/ipa-inline.c", line=1746, function=0x2912cd4 "add_new_edges_to_heap") at ../../gcc-10/gcc/diagnostic.c:1778 #2 0x0000000001f3fb12 in add_new_edges_to_heap (heap=0x7fffffffce90, new_edges=...) at ../../gcc-10/gcc/ipa-inline.c:1746 #3 0x0000000001f412e0 in inline_small_functions () at ../../gcc-10/gcc/ipa-inline.c:2210 #4 0x0000000001f43074 in ipa_inline () at ../../gcc-10/gcc/ipa-inline.c:2689 #5 0x0000000001f43eb1 in (anonymous namespace)::pass_ipa_inline::execute (this=0x2f03ce0) at ../../gcc-10/gcc/ipa-inline.c:3091 #6 0x0000000000fd326c in execute_one_pass (pass=0x2f03ce0) at ../../gcc-10/gcc/passes.c:2502 #7 0x0000000000fd41c9 in execute_ipa_pass_list (pass=0x2f03ce0) at ../../gcc-10/gcc/passes.c:2929 #8 0x0000000000adbb78 in ipa_passes () at ../../gcc-10/gcc/cgraphunit.c:2678 #9 0x0000000000adbd95 in symbol_table::compile (this=0x7ffff7865100) at ../../gcc-10/gcc/cgraphunit.c:2755 #10 0x0000000000adc33d in symbol_table::finalize_compilation_unit (this=0x7ffff7865100) at ../../gcc-10/gcc/cgraphunit.c:3002 #11 0x00000000011332a9 in compile_file () at ../../gcc-10/gcc/toplev.c:483 #12 0x00000000011364aa in do_compile () at ../../gcc-10/gcc/toplev.c:2298 #13 0x00000000011367b6 in toplev::main (this=0x7fffffffd266, argc=37, argv=0x7fffffffd378) at ../../gcc-10/gcc/toplev.c:2437 #14 0x0000000002035d42 in main (argc=37, argv=0x7fffffffd378) at ../../gcc-10/gcc/main.c:39 (gdb) fr 2 #2 0x0000000001f3fb12 in add_new_edges_to_heap (heap=0x7fffffffce90, new_edges=...) at ../../gcc-10/gcc/ipa-inline.c:1746 1746 gcc_assert (!edge->aux); (gdb) list 1741 { 1742 while (new_edges.length () > 0) 1743 { 1744 struct cgraph_edge *edge = new_edges.pop (); 1745 1746 gcc_assert (!edge->aux); 1747 gcc_assert (edge->callee); 1748 if (edge->inline_failed 1749 && can_inline_edge_p (edge, true) 1750 && want_inline_small_function_p (edge, true) Dumping the edge: validate_chain_two_ops/133 -> validate_arith_expr/135 (gdb) call edge->caller->dump(stdout) validate_chain_two_ops/133 (validate_chain_two_ops) @0x7ffff6efc708 Type: function definition analyzed Visibility: prevailing_def_ironly previous sharing asm name: 430 References: parser_error/46 (read) Referring: Function validate_chain_two_ops/133 is inline copy in validate_shift_expr/134 Availability: local Profile id: 607042219 Function flags: count:395 (estimated locally, globally 0) first_run:27 body local unlikely_executed Called by: validate_shift_expr/134 (inlined) (395 (estimated locally, globally 0),1.00 per call) Calls: validate_arith_expr/135 (indirect_inlining) (9 (estimated locally, globally 0 adjusted),0.02 per call) validate_arith_expr/135 (indirect_inlining) (394 (estimated locally, globally 0 adjusted),1.00 per call) PyErr_Format/202 (0 (precise),0.00 per call) (gdb) call edge->callee->dump(stdout) validate_arith_expr/135 (validate_arith_expr) @0x7ffff6efc9d8 Type: function definition analyzed Visibility: prevailing_def_ironly previous sharing asm name: 435 Address is taken. References: parser_error/46 (read) Referring: Availability: available Profile id: 829576279 Function flags: count:1 (adjusted) first_run:28 body hot Called by: validate_chain_two_ops/133 (indirect_inlining) (9 (estimated locally, globally 0 adjusted),0.02 per call) validate_chain_two_ops/491 (indirect_inlining) (9 (adjusted),0.02 per call) validate_chain_two_ops/431 (indirect_inlining) (9 (estimated locally, globally 0 adjusted),0.02 per call) validate_chain_two_ops/133 (indirect_inlining) (394 (estimated locally, globally 0 adjusted),1.00 per call) validate_node/162 (0 (precise),0.00 per call) Calls: PyErr_Format/202 (0 (precise),0.00 per call) validate_chain_two_ops/430 (inlined) (1 (adjusted),1.00 per call) If I understand the assert correctly edge was added twice in the heap (or similar?).