If the following code is compiled by a GCC with checking enabled (configured with --enable-checking=misc,tree,rtl,rtlflag,gc,gcac) and -O1, a ICE happen: static __inline__ int f () { return g (); } int g () { return f (); }
With checking disabled, the ICE does not happen. gcc version: GNU C version 4.1.0 20050815 (experimental) (i686-pc-linux-gnu) Backtrace:Analyzing compilation unit {GC 733k -> 718k} {GC 719k -> 719k} {GC 719k -> 719k}Performing intraprocedural optimizations {GC 721k -> 694k} Program received signal SIGSEGV, Segmentation fault. 0x08aea1eb in cgraph_decide_inlining_incrementally (node=0xb7c62c98, early=1 '\001') at ../.././gcc/ipa-inline.c:1029 1029 if (e->callee->local.disregard_inline_limits (gdb) bt #0 0x08aea1eb in cgraph_decide_inlining_incrementally (node=0xb7c62c98, early=1 '\001') at ../.././gcc/ipa-inline.c:1029 #1 0x08aea64d in cgraph_early_inlining () at ../.././gcc/ipa-inline.c:1131 #2 0x08a59ff0 in execute_one_pass (pass=0x8e71bc0) at ../.././gcc/passes.c:797 #3 0x08a5a0ed in execute_ipa_pass_list (pass=0x8e71bc0) at ../.././gcc/passes.c:843 #4 0x08ae6807 in ipa_passes () at ../.././gcc/cgraphunit.c:1202 #5 0x08ae68c7 in cgraph_optimize () at ../.././gcc/cgraphunit.c:1236 #6 0x0806cdf1 in c_write_global_declarations () at ../.././gcc/c-decl.c:7618 #7 0x089fcc5c in compile_file () at ../.././gcc/toplev.c:984 #8 0x089fe491 in do_compile () at ../.././gcc/toplev.c:1914 #9 0x089fe4f3 in toplev_main (argc=3, argv=0xbff6eb44) at ../.././gcc/toplev.c:1946 #10 0x080ed5ca in main (argc=3, argv=0xbff6eb44) at ../.././gcc/main.c:35 (gdb) p e $1 = (struct cgraph_edge *) 0xa5a5a5a5 (gdb) up #1 0x08aea64d in cgraph_early_inlining () at ../.././gcc/ipa-inline.c:1131 1131 cgraph_decide_inlining_incrementally (node, true); (gdb) p *node $2 = {decl = 0xa5a5a5a5, callees = 0xa5a5a5a5, callers = 0xa5a5a5a5, next = 0xa5a5a5a5, previous = 0xa5a5a5a5, origin = 0xa5a5a5a5, nested = 0xa5a5a5a5, next_nested = 0xa5a5a5a5, next_needed = 0xa5a5a5a5, next_clone = 0xa5a5a5a5, prev_clone = 0xa5a5a5a5, master_clone = 0xa5a5a5a5, aux = 0xa5a5a5a5, local = {self_insns = -1515870811, local = 165 '¥', externally_visible = 165 '¥', finalized = 165 '¥', inlinable = 165 '¥', disregard_inline_limits = 165 '¥', redefined_extern_inline = 165 '¥', for_functions_valid = 165 '¥', vtable_method = 165 '¥'}, global = {inlined_to = 0xa5a5a5a5, insns = -1515870811, estimated_growth = -1515870811, inlined = 165 '¥'}, rtl = {preferred_incoming_stack_boundary = -1515870811}, count = -6510615555426900571, uid = -1515870811, needed = 165 '¥', reachable = 165 '¥', lowered = 165 '¥', analyzed = 165 '¥', output = 165 '¥', externally_visible = 165 '¥', alias = 165 '¥'} As far as I can tell, the garbage collector seems to free some used memory. It is a regression, as GCC version 20050606 did not showed this error. -- Summary: ICE on valid, if checking enabled Product: gcc Version: 4.1.0 Status: UNCONFIRMED Severity: normal Priority: P2 Component: middle-end AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: e9925248 at stud4 dot tuwien dot ac dot at CC: gcc-bugs at gcc dot gnu dot org GCC build triplet: i686-pc-linux-gnu GCC host triplet: i686-pc-linux-gnu GCC target triplet: i686-pc-linux-gnu (exists also on avr) http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23408