Bug 48600 - [4.6 Regression] ICE when using cold attribute
Summary: [4.6 Regression] ICE when using cold attribute
Status: RESOLVED FIXED
Alias: None
Product: gcc
Classification: Unclassified
Component: middle-end (show other bugs)
Version: 4.6.0
: P2 major
Target Milestone: 4.6.4
Assignee: Jan Hubicka
URL:
Keywords: ice-on-valid-code
: 50112 51460 52649 (view as bug list)
Depends on:
Blocks: 51460
  Show dependency treegraph
 
Reported: 2011-04-14 02:36 UTC by Matt Hargett
Modified: 2012-06-11 09:10 UTC (History)
6 users (show)

See Also:
Host:
Target:
Build:
Known to work: 4.7.0
Known to fail: 4.5.3, 4.6.2
Last reconfirmed: 2012-01-19 00:00:00


Attachments
source file which elicits the error at -O[123] (799 bytes, text/x-c++src)
2011-04-14 17:00 UTC, Matt Hargett
Details

Note You need to log in before you can comment on or make changes to this bug.
Description Matt Hargett 2011-04-14 02:36:18 UTC
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.
Comment 1 Richard Biener 2011-04-14 09:23:31 UTC
-ENOATTACHMENT
Comment 2 Matt Hargett 2011-04-14 17:00:19 UTC
Created attachment 23983 [details]
source file which elicits the error at -O[123]
Comment 3 Matt Hargett 2011-04-15 18:30:23 UTC
I added the attachment; are you still waiting on something from me? Let me know :)
Comment 4 Jakub Jelinek 2011-04-18 11:22:48 UTC
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).
Comment 5 Matt Hargett 2011-06-01 14:36:17 UTC
any chance this can be fixed for 4.6.1? this is a critical regression for us.
Comment 6 Jakub Jelinek 2011-06-27 12:32:39 UTC
GCC 4.6.1 is being released.
Comment 7 Jakub Jelinek 2011-08-18 06:06:09 UTC
*** Bug 50112 has been marked as a duplicate of this bug. ***
Comment 8 Richard Biener 2011-08-18 09:08:31 UTC
Honza?
Comment 9 Jan Hubicka 2011-08-19 22:16:41 UTC
mine
Comment 10 Jakub Jelinek 2011-10-26 17:13:23 UTC
GCC 4.6.2 is being released.
Comment 11 Richard Biener 2011-12-09 09:10:38 UTC
*** Bug 51460 has been marked as a duplicate of this bug. ***
Comment 12 Richard Biener 2011-12-09 09:11:19 UTC
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!
Comment 13 Jakub Jelinek 2012-01-24 10:09:38 UTC
Honza, ping?
Comment 14 Jan Hubicka 2012-01-31 14:15:27 UTC
Sorry, missed this bug (and for really long file as I see now). It is originally Zdenek's code. Will check it now.
Comment 15 Jan Hubicka 2012-01-31 14:31:56 UTC
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
Comment 16 Jan Hubicka 2012-02-10 12:21:24 UTC
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
Comment 17 Jan Hubicka 2012-02-10 12:22:50 UTC
Fixed in 4.7. Backport to 4.6 should be easy.
Comment 18 Jakub Jelinek 2012-03-01 14:38:10 UTC
GCC 4.6.3 is being released.
Comment 19 Jan Hubicka 2012-03-23 10:49:37 UTC
*** Bug 52649 has been marked as a duplicate of this bug. ***
Comment 20 Jan Hubicka 2012-03-23 14:22:35 UTC
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
Comment 21 Jan Hubicka 2012-03-23 14:23:23 UTC
Fixed.
Comment 22 jye2 2012-06-11 09:10:14 UTC
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