On Sun, 2005-03-27 at 20:08 -0500, Kazu Hirata wrote:
> Hi Diego,
>
> > By merging, do you mean *replacing* CCP with VRP? Yes, it's
> > doable. No, it's not a good idea.
>
> Understood.
>
> Also, if we are inserting ASSERT_EXPRs, it seems to be a good idea to
> run copy-prop before VRP. Otherwise, we would end up with lots of
>
> D.18001_101 = D.18001_198;
> D.18011_102 = D.18001_101->head_;
> D.18001_12 = ASSERT_EXPR <D.18001_101, D.18001_101 != 0B>;
>
> Note that ASSERT_EXPR is on D.18001_101, not on D.18001_198, which is
> older. As a result, VRP does not notice that D.18001_198 != 0B.
> Currently, we still have these even after copy prop because we don't
> allow copy propagation between const and non-const pointers, which I
> think is a bit too restrictive.
Before we go a lot further with this, I'd like to make sure we're first
all on the same page regarding the semantics of ASSERT_EXPR and whether
or not ASSERT_EXPRs appear on the RHS of MODIFY_EXPRs.
When I looked at using a similar mechanism to store context sensitive
equivalences it became very clear that context sensitive equivalences
must not be recorded with a new assignment.
ie, if we have
if (a_1 == 0)
{
}
We do not want to turn that into
if (a_1 == 0)
{
a_2 = 0;
}
OR
if (a_1 == 0)
{
a_2 = ASSERT_EXPR ...
}
Whatever scheme we use to explicitly expose context sensitive
equivalences in the IL needs to be a pure expression.
This is documented in one of the many compile-time performance PRs
from 2004.
And, yes, it is imperative that we const/copy propagate into
ASSERT_EXPRs to the fullest extent possible. Otherwise we lose a lot
of threading opportunities.
Jeff