Hi, On Tue, 28 Jan 2014, Richard Biener wrote:
> >> The EH optimizations involving cleanups with only clobbers in them > >> are that if at the end of the cleanup after only CLOBBER stmts you > >> would rethrow the exception externally, then the clobber isn't needed > >> and the whole cleanup can be removed. And, if it rethrows somewhere > >> internally, we can move the clobber stmts to the landing pad of > >> wherever it would be caught. > > > > OK, I still do not see how ehclanup1 can then safely remove them > > pre-inline given that the whole function body can be inlined into > > another containing the outer EH region. > > That's true. Yes, and I think they should be removed only after inlining. (Alternatively the inliner could be extended to add clobbers when changing an external-throw into an internal-throw, but well, ...) > > If this is valid, why we can not just eliminate EH in those outer > > clobber try..finally as part of ehlowering earlier? > > Probably we'd miss too many inlining cases from early inlining and the > ehcleanup1 time is just a heuristic that works good enough for us? No, removing even more clobbers would remove even more stack slot sharing. If anything we should remove _less_ regions (as in the precondition for Honzas sentence above, "If this is valid, ..." simply is false). AFAIU this all is just a problem with O0 code quality. So, there's the obvious solution: run ehcleanup also for O0. Ciao, Michael.