On Mon, Oct 15, 2012 at 12:43 PM, Eric Botcazou <ebotca...@adacore.com> wrote: >> Where is mark_addressable called? It's wrong (and generally impossible) to >> do that late. > > In expr.c:emit_block_move_hints. It's one of the calls added to support the > enhanced DSE last year, there are others in calls.c for example.
Ugh ... that looks like a hack to make can_escape "work". It looks to me that we should somehow preserve knowledge on what vars a call may use or clobber (thus the GIMPLE call-use and call-clobber sets). As I'm not sure how to best do that I suggest we do a more proper RTL DSE hack by adding a 'libcall-call-escape'-set which we can add to instead of calling mark_addressable this late. We need to add all partitions of a decl here, of course, and we need to query it from can_escape. But that sounds way cleaner than abusing TREE_ADDRESSABLE for this ... >> If you only have memcpy then escaped will be empty. fixing escaped is >> not the right solution (it may work for some reason in this case though). >> The rtl code has to approximate ref_maybe_used_by_call_p in a conservative >> way which it doesn't seem to do correctly (I don't remember a RTL alias.c >> interface that would match this, or ref_maybe_used_by_stmt_p - maybe >> we should add one?) > > I'm OK with the new bitmap + decls_to_pointers idea. Keep in mind that the > info needs to be updated after update_alias_info_with_stack_vars, because for > > MEM[(c_char * {ref-all})&i] = MEM[(c_char * {ref-all})&A.17]; > > you don't know until expand whether this will a memcpy or a move by pieces and > the info is needed for the enhanced DSE to work properly. Well, it just means that the enhanced DSE is fragile :/ Richard. > -- > Eric Botcazou