[Bug tree-optimization/60003] [4.9 regression] wrong code with __builtin_setjmp/__builtin_longjmp and inlining
jakub at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Fri Jan 31 09:00:00 GMT 2014
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60003
--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Ah, I see what's going on. eliminate_unnecessary_calls in dce calls
clear_special_calls. Before my patch, __builtin_setjmp lowering would add a
dummy non-local label to the function, so that while dce would clear
cfun->calls_setjmp, cfun->has_nonlocal_label would be still set, but with my
patch that is no longer happening, so stmt_can_make_abnormal_goto is always
false during inlining and the corresponding edges aren't added.
So, either e.g. tree-cfg.c could just set cfun->has_nonlocal_label when it sees
a __builtin_setjmp_receiver (or say gimple-low.c when lowering __builtin_setjmp
could set it) to restore status quo.
Or I wonder, is there any special reason to avoid cfun->calls_setjmp when you
actually call setjmp? Like say make __builtin_setjmp_receiver
ECF_RETURNS_TWICE, or just special casing it in notice_special_calls and in the
inliner (which just should call notice_special_calls)?
More information about the Gcc-bugs
mailing list