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.