tree aff_combination_to_tree (aff_tree *comb) { tree type = comb->type; tree expr = NULL_TREE; unsigned i; double_int off, sgn; tree type1 = type; if (POINTER_TYPE_P (type)) type1 = sizetype; gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE); for (i = 0; i < comb->n; i++) expr = add_elt_to_tree (expr, type, comb->elts[i].val, comb->elts[i].coef, comb); if (comb->rest) expr = add_elt_to_tree (expr, type, comb->rest, double_int_one, comb); /* Ensure that we get x - 1, not x + (-1) or x + 0xff..f if x is unsigned. */ if (comb->offset.is_negative ()) { off = -comb->offset; sgn = double_int_minus_one; } else { off = comb->offset; sgn = double_int_one; } return add_elt_to_tree (expr, type, double_int_to_tree (type1, off), sgn, comb); }
tree aff_combination_to_tree (aff_tree *comb) { tree type = comb->type; tree expr = comb->rest; unsigned i; double_int off, sgn; gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE); for (i = 0; i < comb->n; i++) expr = add_elt_to_tree (expr, type, comb->elts[i].val, comb->elts[i].coef, comb); /* Ensure that we get x - 1, not x + (-1) or x + 0xff..f if x is unsigned. */ if (double_int_negative_p (comb->offset)) { off = double_int_neg (comb->offset); sgn = double_int_minus_one; } else { off = comb->offset; sgn = double_int_one; } return add_elt_to_tree (expr, type, double_int_to_tree (type, off), sgn, comb); }
tree aff_combination_to_tree (aff_tree *comb) { tree type = comb->type, base = NULL_TREE, expr = NULL_TREE; unsigned i; poly_widest_int off; int sgn; gcc_assert (comb->n == MAX_AFF_ELTS || comb->rest == NULL_TREE); i = 0; if (POINTER_TYPE_P (type)) { type = sizetype; if (comb->n > 0 && comb->elts[0].coef == 1 && POINTER_TYPE_P (TREE_TYPE (comb->elts[0].val))) { base = comb->elts[0].val; ++i; } } for (; i < comb->n; i++) expr = add_elt_to_tree (expr, type, comb->elts[i].val, comb->elts[i].coef); if (comb->rest) expr = add_elt_to_tree (expr, type, comb->rest, 1); /* Ensure that we get x - 1, not x + (-1) or x + 0xff..f if x is unsigned. */ if (known_lt (comb->offset, 0)) { off = -comb->offset; sgn = -1; } else { off = comb->offset; sgn = 1; } expr = add_elt_to_tree (expr, type, wide_int_to_tree (type, off), sgn); if (base) return fold_build_pointer_plus (base, expr); else return fold_convert (comb->type, expr); }