bool expressions_equal_p (tree e1, tree e2) { tree te1, te2; if (e1 == e2) return true; te1 = TREE_TYPE (e1); te2 = TREE_TYPE (e2); if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST) { tree lop1 = e1; tree lop2 = e2; for (lop1 = e1, lop2 = e2; lop1 || lop2; lop1 = TREE_CHAIN (lop1), lop2 = TREE_CHAIN (lop2)) { if (!lop1 || !lop2) return false; if (!expressions_equal_p (TREE_VALUE (lop1), TREE_VALUE (lop2))) return false; } return true; } else if (TREE_CODE (e1) == TREE_CODE (e2) && (te1 == te2 || lang_hooks.types_compatible_p (te1, te2)) && operand_equal_p (e1, e2, OEP_PURE_SAME)) return true; return false; }
bool expressions_equal_p (tree e1, tree e2) { tree te1, te2; /* The obvious case. */ if (e1 == e2) return true; /* If only one of them is null, they cannot be equal. */ if (!e1 || !e2) return false; /* Recurse on elements of lists. */ if (TREE_CODE (e1) == TREE_LIST && TREE_CODE (e2) == TREE_LIST) { tree lop1 = e1; tree lop2 = e2; for (lop1 = e1, lop2 = e2; lop1 || lop2; lop1 = TREE_CHAIN (lop1), lop2 = TREE_CHAIN (lop2)) { if (!lop1 || !lop2) return false; if (!expressions_equal_p (TREE_VALUE (lop1), TREE_VALUE (lop2))) return false; } return true; } te1 = TREE_TYPE (e1); te2 = TREE_TYPE (e2); /* Now perform the actual comparison. */ if (TREE_CODE (e1) == TREE_CODE (e2) && (te1 == te2 || types_compatible_p (te1, te2)) && operand_equal_p (e1, e2, OEP_PURE_SAME)) return true; return false; }
static int val_expr_pair_expr_eq (const void *p1, const void *p2) { int i; tree vuse1; const val_expr_pair_t ve1 = (val_expr_pair_t) p1; const val_expr_pair_t ve2 = (val_expr_pair_t) p2; if (! expressions_equal_p (ve1->e, ve2->e)) return false; if (ve1->vuses == ve2->vuses) return true; if (VEC_length (tree, ve1->vuses) != VEC_length (tree, ve2->vuses)) return false; for (i = 0; VEC_iterate (tree, ve1->vuses, i, vuse1); i++) { if (VEC_index (tree, ve2->vuses, i) != vuse1) return false; } return true; }