http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46560
--- Comment #1 from Richard Guenther <rguenth at gcc dot gnu.org> 2010-11-26
14:02:28 UTC ---
FAIL: 21_strings/basic_string/insert/char/1.cc execution test
is because we optimize away EH code. A stripped-down testcase shows instead
of
Eh tree:
3 cleanup land:{3,<L16>}
6 cleanup
7 cleanup land:{5,<L14>}
11 try land:{7,<L11>} catch:{struct out_of_range},{}
8 try land:{6,<L8>} catch:{struct out_of_range},{}
Eh tree:
3 cleanup land:{3,<L14>}
6 cleanup
7 cleanup land:{5,<L12>}
8 try land:{6,<L6>} catch:{(void *) &_ZTISt12out_of_range},{}
it's already broken at .044i.inline - one insert call doesn't have eh info.
I suspect that nothrow discovery is broken somehow.
Function found to be nothrow: insert
insert/19(-1) @0x7ffff5d1fdc0 (asm: _ZNSs6insertEmRKSsmm) (inline copy in
test01/5) (clone of insert/0) availability:local analyzed 29 time, 20 benefit
25 size, 12 benefit reachable local finalized inlinable
called by: test01/5 (1.00 per call) (inlined)
calls: __throw_out_of_range/8 insert/7 (1.00 per call)
References:
Refering this function:
but we have before propagate nothrow:
insert/19(-1) @0x7ffff5d1fdc0 (asm: _ZNSs6insertEmRKSsmm) (inline copy in
test01/5) (clone of insert/0) availability:local analyzed 29 time, 20 benefit
25 size, 12 benefit reachable local finalized inlinable
called by: test01/5 (1.00 per call) (inlined)
calls: __throw_out_of_range/8 insert/7 (1.00 per call)
References:
Refering this function:
__throw_out_of_range/8(-1) @0x7ffff5d1ec60 (asm: _ZSt20__throw_out_of_rangePKc)
availability:not_available reachable
called by: insert/19 insert/0 (can throw external)
calls:
References:
Refering this function:
insert/0(-1) @0x7ffff5d1e160 (asm: _ZNSs6insertEmRKSsmm) availability:available
analyzed 29 time, 20 benefit 25 size, 12 benefit reachable finalized inlinable
called by: test01/5
calls: insert/7 (1.00 per call) (can throw external) __throw_out_of_range/8
(can throw external)
References:
Refering this function:
so __throw_out_of_range/8 can throw.
During propagation visiting insert/19 we visit the edge to
__throw_out_of_range.
The edge has e->can_throw_external == 0, probably because:
edge->can_throw_external
= call_stmt ? stmt_can_throw_external (call_stmt) : false;
in cgraph.c which isn't exactly a conservative assumption.
(gdb) p e
$13 = (struct cgraph_edge *) 0x7ffff5d20548
(gdb) p e->caller
$14 = (struct cgraph_node *) 0x7ffff5d1fdc0
(gdb) p e->callee
$15 = (struct cgraph_node *) 0x7ffff5d1ec60
which is an inline clone edge. I suppose cgraph_clone_edge should clone
the flags that depend on call_stmt as well.
That fixes it.