On Mon, 11 Nov 2013, Tom de Vries wrote:

> On 11/11/13 10:50, Richard Biener wrote:
> > On Sat, 9 Nov 2013, Tom de Vries wrote:
> >> Bootstrapped and regtested on x86_64.
> >>
> >> OK for trunk?
> > 
> > Comments inline
> > 
> > 
> > diff --git a/gcc/tree-ssa-tail-merge.c b/gcc/tree-ssa-tail-merge.c
> > index 98b5882..43516a7 100644
> > --- a/gcc/tree-ssa-tail-merge.c
> > +++ b/gcc/tree-ssa-tail-merge.c
> > @@ -1173,8 +1173,47 @@ gimple_equal_p (same_succ same_succ, gimple s1, 
> > gimple s2)
> >        lhs2 = gimple_get_lhs (s2);
> >        if (TREE_CODE (lhs1) != SSA_NAME
> >       && TREE_CODE (lhs2) != SSA_NAME)
> > -   return (vn_valueize (gimple_vdef (s1))
> > -           == vn_valueize (gimple_vdef (s2)));
> > +   {
> > +     /* If the vdef is the same, it's the same statement.  */
> > +     if (vn_valueize (gimple_vdef (s1))
> > +         == vn_valueize (gimple_vdef (s2)))
> > +       return true;
> > +
> > +     /* If the vdef is not the same but the vuse is the same, it's not the
> > +        same stmt.  */
> > +     if (vn_valueize (gimple_vuse (s1))
> > +         == vn_valueize (gimple_vuse (s2)))
> > +       return false;
> > 
> 
> Richard,
> 
> > What's the logic behind this?
> > We want to use VN to get more "positive"
> > results
> 
> We can use it to get both positive and negative results faster.

I can get a negative result for free: "false" ;)

VN proves equivalency it doesn't prove non-equivalency - that's
simply its conservative fallback.

> > - doing a negative early out looks suspicious to me ...
> > 
> 
> If the vdefs are the same, the VN has concluded that the statements are the
> same. We have a positive early out.
> 
> If the vdefs are not the same, the VN has concluded that the statements are
> different. But if the vuses are the same, the VN has concluded that the
> statements are different because of structural difference. Which means there's
> no sense in us repeating the structural comparison. We have a negative early 
> out.

Well, see above - it merely failed to prove equivalency, it didn't
actually conclude they are different.
 
> If the vdefs are not the same, the VN has concluded that the statements are
> different. But if the vuses are different, the VN may have concluded that the
> statements are different because of the different vuses. So it still makes 
> sense
> to try structural comparison.
> 
> > +     /* If the vdef is not the same and the vuse is not the same, it might 
> > be
> > +        same stmt.  */
> > +
> > +     /* Test for structural equality.  */
> > +     if (gimple_assign_rhs_code (s1) != gimple_assign_rhs_code (s1)
> > 
> > s2
> > 
> > +         || (gimple_assign_nontemporal_move_p (s1)
> > +             != gimple_assign_nontemporal_move_p (s2)))
> > 
> > I don't think we should care (it'll be false - a later pass sets it,
> > it's an optimization hint, not a correctness issue).  More interesting
> > would be to assert that has_volatile_ops is the same if the operands
> > turned out to be the same.
> > 
> 
> OK.
> 
> > +       return false;
> > +
> > +     if (!operand_equal_p (lhs1, lhs2, 0))
> > +       return false;
> > +
> > +     t1 = gimple_assign_rhs1 (s1);
> > +     t2 = gimple_assign_rhs1 (s2);
> > +     if (!gimple_operand_equal_value_p (t1, t2))
> > +       return false;
> > +
> > +     t1 = gimple_assign_rhs2 (s1);
> > +     t2 = gimple_assign_rhs2 (s2);
> > +     if (!gimple_operand_equal_value_p (t1, t2))
> > +       return false;
> > +
> > +     t1 = gimple_assign_rhs3 (s1);
> > +     t2 = gimple_assign_rhs3 (s2);
> > +     if (!gimple_operand_equal_value_p (t1, t2))
> > +       return false;
> > 
> >   for (i = 1; i < gimple_num_ops (s1); ++i)
> >     t1 = gimple_op (s1, i);
> >     ...
> > 
> > but I think you should only compare rhs1 and thus only handle
> > GIMPLE_ASSIGN_SINGLEs this way - the others have a SSA name
> > lhs.
> > 
> 
> I see.
> 
> > That makes the whole thing just
> > 
> >       if (TREE_CODE (lhs1) != SSA_NAME
> >           && TREE_CODE (lhs2) != SSA_NAME)
> >         {
> >            if (vn_valueize (gimple_vdef (s1))
> >                == vn_valueize (gimple_vdef (s2)))
> >          return true;
> >            return operand_equal_p (lhs1, lhs2, 0)
> >                && gimple_operand_equal_value_p (gimple_assign_rhs1 (s1),
> >                                                  gimple_assign_rhs2 (s2));
> >         }
> > 
> > Ok with doing it this way.
> 
> I'll retest and checkin like this, unless you agree about the early out, 
> which I
> still think is a good idea, although the structural test is now much smaller.

I think the early out is premature.

Richard.

Reply via email to