http://gcc.gnu.org/bugzilla/show_bug.cgi?id=51460
Richard Guenther <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW Last reconfirmed| |2011-12-08 Component|c++ |middle-end Target Milestone|--- |4.6.3 Summary|[4.6 regression] Struct |[4.6/4.7 Regression] Struct |with two boost mutexes |with two boost mutexes |allocated on the heap |allocated on the heap |inside of a while loop |inside of a while loop |causes compiler segfault |causes compiler segfault Ever Confirmed|0 |1 --- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-12-08 10:05:34 UTC --- Confirmed with -O1. Program received signal SIGSEGV, Segmentation fault. 0x0000000000bb9511 in VEC_edge_base_index (vec_=0x7ffff52e2cf8, ix_=0, file_=Cannot access memory at address 0x7fffff7feff8 ) at /space/rguenther/src/svn/gcc-4_6-branch/gcc/basic-block.h:64 64 DEF_VEC_P(edge); (gdb) bt #1 0x0000000000bb9500 in ei_edge (i=...) at /space/rguenther/src/svn/gcc-4_6-branch/gcc/basic-block.h:671 #2 0x0000000000bb942d in ei_cond (ei=..., p=0x7fffff7ff0e8) at /space/rguenther/src/svn/gcc-4_6-branch/gcc/basic-block.h:692 #3 0x0000000000bbdd75 in predict_paths_for_bb (cur=0x7ffff19a3888, bb=0x7ffff1b2f270, pred=PRED_CONTINUE, taken=NOT_TAKEN) at /space/rguenther/src/svn/gcc-4_6-branch/gcc/predict.c:1801 #4 0x0000000000bbdda6 in predict_paths_for_bb (cur=0x7ffff1b2f270, bb=0x7ffff1b2f270, pred=PRED_CONTINUE, taken=NOT_TAKEN) at /space/rguenther/src/svn/gcc-4_6-branch/gcc/predict.c:1836 ... we endlessly recurse in predict_paths_for_bb walking 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); (we never do anything else in the loop above it). Sequence of recursion is (cur, bb): (7, 9) (3, 3) (9, 9) (7, 9) ... ;; basic block 2, loop depth 0, count 0 ;; prev block 0, next block 9 ;; pred: ENTRY (fallthru,exec) ;; succ: 9 [100.0%] (fallthru) <bb 2>: ;; basic block 9, loop depth 1, count 0 ;; prev block 2, next block 3 ;; pred: 2 [100.0%] (fallthru) 7 (fallthru,exec) ;; succ: 3 [100.0%] (fallthru,exec) 8 (eh,exec) <bb 9>: f_1 = operator new (80); D.102841_9 = &f_1->bar; boost::mutex::mutex (D.102841_9); ;; basic block 3, loop depth 1, count 0 ;; prev block 9, next block 4 ;; pred: 9 [100.0%] (fallthru,exec) ;; succ: 7 [100.0%] (fallthru,exec) 4 (eh,exec) <bb 3>: D.102840_10 = &f_1->baz; boost::mutex::mutex (D.102840_10); goto <bb 7>; ;; basic block 7, loop depth 1, count 0 ;; prev block 6, next block 8 ;; pred: 3 [100.0%] (fallthru,exec) ;; succ: 9 (fallthru,exec) <bb 7>: // predicted unlikely by continue predictor. goto <bb 9>; ... so it seems post-dominators do not honor EH-edges, or at least it is inconsistent with the way we add fake exit edges for infinite loops.