On Mon, Oct 15, 2012 at 12:43 PM, Eric Botcazou <[email protected]> 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