bool eq_evolutions_p (const_tree chrec0, const_tree chrec1) { if (chrec0 == NULL_TREE || chrec1 == NULL_TREE || TREE_CODE (chrec0) != TREE_CODE (chrec1)) return false; if (chrec0 == chrec1) return true; switch (TREE_CODE (chrec0)) { case INTEGER_CST: return operand_equal_p (chrec0, chrec1, 0); case POLYNOMIAL_CHREC: return (CHREC_VARIABLE (chrec0) == CHREC_VARIABLE (chrec1) && eq_evolutions_p (CHREC_LEFT (chrec0), CHREC_LEFT (chrec1)) && eq_evolutions_p (CHREC_RIGHT (chrec0), CHREC_RIGHT (chrec1))); case PLUS_EXPR: case MULT_EXPR: case MINUS_EXPR: case POINTER_PLUS_EXPR: return eq_evolutions_p (TREE_OPERAND (chrec0, 0), TREE_OPERAND (chrec1, 0)) && eq_evolutions_p (TREE_OPERAND (chrec0, 1), TREE_OPERAND (chrec1, 1)); default: return false; } }
bool eq_evolutions_p (tree chrec0, tree chrec1) { if (chrec0 == NULL_TREE || chrec1 == NULL_TREE || TREE_CODE (chrec0) != TREE_CODE (chrec1)) return false; if (chrec0 == chrec1) return true; switch (TREE_CODE (chrec0)) { case INTEGER_CST: return operand_equal_p (chrec0, chrec1, 0); case POLYNOMIAL_CHREC: return (CHREC_VARIABLE (chrec0) == CHREC_VARIABLE (chrec1) && eq_evolutions_p (CHREC_LEFT (chrec0), CHREC_LEFT (chrec1)) && eq_evolutions_p (CHREC_RIGHT (chrec0), CHREC_RIGHT (chrec1))); default: return false; } }
tree chrec_merge (tree chrec1, tree chrec2) { if (chrec1 == chrec_dont_know || chrec2 == chrec_dont_know) return chrec_dont_know; if (chrec1 == chrec_known || chrec2 == chrec_known) return chrec_known; if (chrec1 == chrec_not_analyzed_yet) return chrec2; if (chrec2 == chrec_not_analyzed_yet) return chrec1; if (eq_evolutions_p (chrec1, chrec2)) return chrec1; return chrec_dont_know; }