https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93199
--- Comment #22 from rguenther at suse dot de <rguenther at suse dot de> --- On Mon, 13 Jan 2020, marxin at gcc dot gnu.org wrote: > https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93199 > > --- Comment #21 from Martin Liška <marxin at gcc dot gnu.org> --- > > Well - there's the leh_state passed to both callers of the function > > so I expected a patch to amend that rather than adding an on-the-side > > caching hash-map. So basically whenever we push a non-CLEANUP > > update leh_state->xyz and when backtracking update it back (the whole > > process looked recursive from a quick look). > > Yes, it's recurring, but leh_state instances are different: > > #0 cleanup_is_dead_in (reg=0x7ffff5e94478) at > /home/marxin/Programming/gcc/gcc/tree-eh.c:1640 > #1 0x00000000010c0ca6 in lower_try_finally (state=0x7fffffffc060, > tp=0x7ffff2f0f4d0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1676 > #2 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffc060, > gsi=0x7fffffffc020) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > #3 0x00000000010c1e8a in lower_eh_constructs_1 (state=0x7fffffffc060, > pseq=0x7ffff2f0f4c0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2158 > #4 0x00000000010c0d53 in lower_try_finally (state=0x7fffffffc220, > tp=0x7ffff2f0f498) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1693 > #5 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffc220, > gsi=0x7fffffffc1e0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > #6 0x00000000010c1e8a in lower_eh_constructs_1 (state=0x7fffffffc220, > pseq=0x7ffff2f0f488) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2158 > #7 0x00000000010c0d53 in lower_try_finally (state=0x7fffffffc3e0, > tp=0x7ffff2f0f460) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1693 > #8 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffc3e0, > gsi=0x7fffffffc3a0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > #9 0x00000000010c1e8a in lower_eh_constructs_1 (state=0x7fffffffc3e0, > pseq=0x7ffff2f0f450) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2158 > #10 0x00000000010c0d53 in lower_try_finally (state=0x7fffffffc5a0, > tp=0x7ffff2f0f428) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1693 > #11 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffc5a0, > gsi=0x7fffffffc560) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > #12 0x00000000010c1e8a in lower_eh_constructs_1 (state=0x7fffffffc5a0, > pseq=0x7ffff2f0f418) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2158 > #13 0x00000000010c0d53 in lower_try_finally (state=0x7fffffffc760, > tp=0x7ffff2f0f3f0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1693 > #14 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffc760, > gsi=0x7fffffffc720) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > #15 0x00000000010c1e8a in lower_eh_constructs_1 (state=0x7fffffffc760, > pseq=0x7ffff2f0f3e0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2158 > #16 0x00000000010c0d53 in lower_try_finally (state=0x7fffffffc920, > tp=0x7ffff2f0f3b8) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1693 > #17 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffc920, > gsi=0x7fffffffc8e0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > #18 0x00000000010c1e8a in lower_eh_constructs_1 (state=0x7fffffffc920, > pseq=0x7ffff2f0f3a8) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2158 > #19 0x00000000010c0d53 in lower_try_finally (state=0x7fffffffcae0, > tp=0x7ffff2f0f380) at /home/marxin/Programming/gcc/gcc/tree-eh.c:1693 > #20 0x00000000010c1cdf in lower_eh_constructs_2 (state=0x7fffffffcae0, > gsi=0x7fffffffcaa0) at /home/marxin/Programming/gcc/gcc/tree-eh.c:2099 > > where a new 'state' is always created here: > > 1769 static gimple_seq > 1770 lower_catch (struct leh_state *state, gtry *tp) > 1771 { > 1772 eh_region try_region = NULL; > 1773 struct leh_state this_state = *state; > ... But it's copied. There's a reason why I didn't tackle it (because of this interwided stuff). But I don't like the simple cache-map.