On Sep 20, 2011, Jakub Jelinek <ja...@redhat.com> wrote:

> For NOTE_INSN_CALL_ARG_LOCATION, the locations aren't location lists, but
> a single location at the point of the call.  They are independent of
> all other locations, so any kind of caching only decreases the chance
> that a suitable location

With the proposed patch, we cache full expressions, and we should have
an expression if there's a location for the expression (save for
expression depth limits).

> is found (and as the numbers show, it decreases it a lot).

It decreased because of a bug: many equivalence expressions that used to
be only in the cselib equivalence lists were no longer used with the
proposed patch.  I have a fix to bring them back in, but see below.

>> > can't it be postponed to start of vt_emit* phase

>> If my hunch is correct, no.  My concern is precisely that the equivalent
>> may cease to hold (say once we cross a val_reset within a loop), but
>> we'll keep on relying on it.

> After vt_initialize, all cselib locations should hold are just some
> expressions containing VALUEs, constants, ENTRY_VALUEs and nothing else,
> all REGs and MEMs are supposed to be flushed.  Those are equivalences that
> are always constant, they don't need any kind of resetting and they never
> cease to hold.  Say VALUE3 is always VALUE1 + VALUE2.

I realize that.  The problem is, I had observed nonsensical equivalences
in dataflow_set loc lists such as (plus (value) (const_int)) in the
location list of the value itself (and a nonzero constant).  After much
pondering, I've concluded that this was a symptom of the first round of
dataflow analysis in the initial implementation of VTA, in which we used
union rather than intersection semantics.  This is no longer the case,
and I've now convinced myself this can't happen any more, so we can rely
on cselib equivalences, not just for expanding location expressions as
we did before my patch (and will do again in a subsequent version of
it), but also for dataflow set merging (the next algorithm I'm going to
try to optimize).

>> > Can't you use ENUM_BITFIELD (onepart_enum) onepart : 8; instead?

>> I don't think it will then be packed in the same word as n_var_parts.

> enum A { B, C, D };
> struct S { char a; enum A b : 8; char c; char d; };
> int i = sizeof (struct S);

> results in i = 4 for all the cc1 and cc1plus cross compilers on my box I've
> tried, with various ABI options.

Yeah, I'm pretty sure GCC will behave like that on nearly all ABIs, but
that's not mandated by standards.  Indeed, IIRC even enum bitfields
aren't mandated by standards.  That's why we have ENUM_BITFIELD, after
all!  Anyway, since ENUM_BITFIELD was supposed to address this very
issue, I guess it just makes sense for me to go with it ;-)

>> if we stop using cselib locs (like this patch does), if we didn't
>> record the equivalent in the dataflow_set table, we'd lose it.

> They weren't used by var-tracking before at all

Actually, they were, but in a somewhat obscure way: when a
cselib_expand_value_rtx_cb callback returns the VALUE it was asked to
expand, cselib proceeds to expand it using its own equivalence list.
vt_expand_loc_callback would often return it, when it couldn't find an
expansion on its own.

I'll probably make it explicit in vt_expand_loc_callback now, so as to
be able to select the best expansion among all.

> If it is just performance optimization, I'd say there should be
>   gcc_checking_assert (DECL_RTL_SET_P (dtemp));
> before it to verify and make it obvious that you aren't expecting it to be
> NULL.

I'm adding DECL_RTL_KNOWN_SET, with a DECL_RTL_SET_P checking_assert,
and using that.  How's that?

-- 
Alexandre Oliva, freedom fighter    http://FSFLA.org/~lxoliva/
You must be the change you wish to see in the world. -- Gandhi
Be Free! -- http://FSFLA.org/   FSF Latin America board member
Free Software Evangelist      Red Hat Brazil Compiler Engineer

Reply via email to