Compiling the attached file at -O1 or above yields a stack overflow: g++ -O1 ci.cpp g++: internal compiler error: Segmentation fault (program cc1plus) valgrind says: ==7379== Stack overflow in thread 1: can't grow stack to 0x7fe801ff8 ==7379== Can't extend stack to 0x7fe801410 during signal delivery for thread 1: ==7379== no stack segment ==7379== ==7379== Process terminating with default action of signal 11 (SIGSEGV) ==7379== Access not within mapped region at address 0x7FE801410 ==7379== at 0x89E8D5: ??? (in /usr/lib/gcc-snapshot/libexec/gcc/x86_64-linux-gnu/4.6.0/cc1plus) ==7379== If you believe this happened as a result of a stack ==7379== overflow in your program's main thread (unlikely but ==7379== possible), you can try to increase the size of the ==7379== main thread stack using the --main-stacksize= flag. ==7379== The main thread stack size used in this run was 8388608. ==7379== Stack overflow in thread 1: can't grow stack to 0x7fe801f70 If you remove the cold attribute from Arch::Debugger_entry(), the ICE (and explosive memory consumption) goes away. Tested with 4.6.0 RC, final, and another 4.6 variant. They all have the same problem. Testing with 4.5.2 and 4.4.4 shows no such problem.
-ENOATTACHMENT
Created attachment 23983 [details] source file which elicits the error at -O[123]
I added the attachment; are you still waiting on something from me? Let me know :)
Simplified testcase for -O: struct A { ~A (); }; const A &operator << (const A &, const char *); void bar () __attribute__ ((cold)); void foo (void) { for (;;) { A a; a << "foo"; bar (); } } Caused by http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=161691 found is false and leads into infinite recursion in predict_paths_for_bb (alternating 3 bbs forever).
any chance this can be fixed for 4.6.1? this is a critical regression for us.
GCC 4.6.1 is being released.
*** Bug 50112 has been marked as a duplicate of this bug. ***
Honza?
mine
GCC 4.6.2 is being released.
*** Bug 51460 has been marked as a duplicate of this bug. ***
Testcase from PR51460 class mx { public: mx(); }; int main() { while (true) { mx *bar = new mx; mx *baz = new mx; continue; } return 0; } Honza, please work on your bugs!
Honza, ping?
Sorry, missed this bug (and for really long file as I see now). It is originally Zdenek's code. Will check it now.
I am testing the attached patch Index: predict.c =================================================================== --- predict.c (revision 183666) +++ predict.c (working copy) @@ -1833,6 +1833,10 @@ predict_paths_for_bb (basic_block cur, b edge_iterator ei; basic_block son; + /* AUX is used to detect cycles while walking predictors with only EH/FAKE + succestors. */ + cur->aux = (void *)(size_t) 1; + /* We are looking for all edges forming edge cut induced by set of all blocks postdominated by BB. */ FOR_EACH_EDGE (e, ei, cur->preds) @@ -1848,7 +1852,7 @@ predict_paths_for_bb (basic_block cur, b continue; gcc_assert (bb == cur || dominated_by_p (CDI_POST_DOMINATORS, cur, bb)); - /* See if there is how many edge from e->src that is not abnormal + /* See if there is an edge from e->src that is not abnormal and does not lead to BB. */ FOR_EACH_EDGE (e2, ei2, e->src->succs) if (e2 != e @@ -1864,13 +1868,14 @@ predict_paths_for_bb (basic_block cur, b leading to e->src. */ if (found) predict_edge_def (e, pred, taken); - else + else if (!e->src->aux) predict_paths_for_bb (e->src, e->src, pred, taken); } for (son = first_dom_son (CDI_POST_DOMINATORS, cur); son; son = next_dom_son (CDI_POST_DOMINATORS, son)) predict_paths_for_bb (son, bb, pred, taken); + cur->aux = (void *)(size_t) NULL; } /* Sets branch probabilities according to PREDiction and
Author: hubicka Date: Fri Feb 10 12:21:16 2012 New Revision: 184089 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=184089 Log: PR middle-end/48600 * predict.c (predict_paths_for_bb): Prevent looping. (predict_paths_leading_to_edge, predict_paths_leading_to): Update. * g++.dg/torture/pr48600.C: New testcase. Added: trunk/gcc/testsuite/g++.dg/torture/pr48600.C Modified: trunk/gcc/ChangeLog trunk/gcc/predict.c trunk/gcc/testsuite/ChangeLog
Fixed in 4.7. Backport to 4.6 should be easy.
GCC 4.6.3 is being released.
*** Bug 52649 has been marked as a duplicate of this bug. ***
Author: hubicka Date: Fri Mar 23 14:22:24 2012 New Revision: 185739 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=185739 Log: Backport from mainline PR middle-end/48600 * predict.c (predict_paths_for_bb): Prevent looping. (predict_paths_leading_to_edge, predict_paths_leading_to): Update. Modified: branches/gcc-4_6-branch/gcc/ChangeLog branches/gcc-4_6-branch/gcc/predict.c branches/gcc-4_6-branch/gcc/testsuite/ChangeLog
Fixed.
Author: jye2 Date: Mon Jun 11 09:10:07 2012 New Revision: 188381 URL: http://gcc.gnu.org/viewcvs?root=gcc&view=rev&rev=188381 Log: 2012-06-11 Joey Ye <joey.ye@arm.com> Backport r184089,184180 from mainline 2012-02-10 Jan Hubicka <jh@suse.cz> PR middle-end/48600 * predict.c (predict_paths_for_bb): Prevent looping. (predict_paths_leading_to_edge, predict_paths_leading_to): Update. 2012-02-13 Jan Hubicka <jh@suse.cz> PR middle-end/52214 * predict.c (predict_paths_for_bb): Fix thinko in prevoius patch. Backport partly r181172 from mainline 2011-11-08 Michael Matz <matz@suse.de> PR bootstrap/51969 * gengtype.c (write_field_root): Avoid out-of-scope access of newv. testsuite: Backport r184089 from mainline 2012-02-10 Jan Hubicka <jh@suse.cz> PR middle-end/48600 * g++.dg/torture/pr48600.C: New testcase. Added: branches/ARM/embedded-4_6-branch/gcc/testsuite/c-c++-common/pr52181.c branches/ARM/embedded-4_6-branch/gcc/testsuite/g++.dg/torture/pr48600.C Modified: branches/ARM/embedded-4_6-branch/gcc/ChangeLog.arm branches/ARM/embedded-4_6-branch/gcc/gengtype.c branches/ARM/embedded-4_6-branch/gcc/predict.c branches/ARM/embedded-4_6-branch/gcc/testsuite/ChangeLog.arm