This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[028/nnn] poly_int: ipa_parm_adjustment
- From: Richard Sandiford <richard dot sandiford at linaro dot org>
- To: gcc-patches at gcc dot gnu dot org
- Date: Mon, 23 Oct 2017 18:11:28 +0100
- Subject: [028/nnn] poly_int: ipa_parm_adjustment
- Authentication-results: sourceware.org; auth=none
- References: <871sltvm7r.fsf@linaro.org>
This patch changes the type of ipa_parm_adjustment::offset from
HOST_WIDE_INT to poly_int64 and updates uses accordingly.
2017-10-23 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
gcc/
* ipa-prop.h (ipa_parm_adjustment::offset): Change from
HOST_WIDE_INT to poly_int64_pod.
* ipa-prop.c (ipa_modify_call_arguments): Track polynomail
parameter offsets.
Index: gcc/ipa-prop.h
===================================================================
--- gcc/ipa-prop.h 2017-10-23 17:07:40.959671257 +0100
+++ gcc/ipa-prop.h 2017-10-23 17:16:58.508429306 +0100
@@ -828,7 +828,7 @@ struct ipa_parm_adjustment
/* Offset into the original parameter (for the cases when the new parameter
is a component of an original one). */
- HOST_WIDE_INT offset;
+ poly_int64_pod offset;
/* Zero based index of the original parameter this one is based on. */
int base_index;
Index: gcc/ipa-prop.c
===================================================================
--- gcc/ipa-prop.c 2017-10-23 17:07:40.959671257 +0100
+++ gcc/ipa-prop.c 2017-10-23 17:16:58.507429441 +0100
@@ -4302,15 +4302,14 @@ ipa_modify_call_arguments (struct cgraph
simply taking the address of a reference inside the original
aggregate. */
- gcc_checking_assert (adj->offset % BITS_PER_UNIT == 0);
+ poly_int64 byte_offset = exact_div (adj->offset, BITS_PER_UNIT);
base = gimple_call_arg (stmt, adj->base_index);
loc = DECL_P (base) ? DECL_SOURCE_LOCATION (base)
: EXPR_LOCATION (base);
if (TREE_CODE (base) != ADDR_EXPR
&& POINTER_TYPE_P (TREE_TYPE (base)))
- off = build_int_cst (adj->alias_ptr_type,
- adj->offset / BITS_PER_UNIT);
+ off = build_int_cst (adj->alias_ptr_type, byte_offset);
else
{
HOST_WIDE_INT base_offset;
@@ -4330,8 +4329,7 @@ ipa_modify_call_arguments (struct cgraph
if (!base)
{
base = build_fold_addr_expr (prev_base);
- off = build_int_cst (adj->alias_ptr_type,
- adj->offset / BITS_PER_UNIT);
+ off = build_int_cst (adj->alias_ptr_type, byte_offset);
}
else if (TREE_CODE (base) == MEM_REF)
{
@@ -4341,8 +4339,7 @@ ipa_modify_call_arguments (struct cgraph
deref_align = TYPE_ALIGN (TREE_TYPE (base));
}
off = build_int_cst (adj->alias_ptr_type,
- base_offset
- + adj->offset / BITS_PER_UNIT);
+ base_offset + byte_offset);
off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
off);
base = TREE_OPERAND (base, 0);
@@ -4350,8 +4347,7 @@ ipa_modify_call_arguments (struct cgraph
else
{
off = build_int_cst (adj->alias_ptr_type,
- base_offset
- + adj->offset / BITS_PER_UNIT);
+ base_offset + byte_offset);
base = build_fold_addr_expr (base);
}
}
@@ -4602,7 +4598,7 @@ ipa_get_adjustment_candidate (tree **exp
struct ipa_parm_adjustment *adj = &adjustments[i];
if (adj->base == base
- && (adj->offset == offset || adj->op == IPA_PARM_OP_REMOVE))
+ && (must_eq (adj->offset, offset) || adj->op == IPA_PARM_OP_REMOVE))
{
cand = adj;
break;
@@ -4766,7 +4762,10 @@ ipa_dump_param_adjustments (FILE *file,
else if (adj->op == IPA_PARM_OP_REMOVE)
fprintf (file, ", remove_param");
else
- fprintf (file, ", offset %li", (long) adj->offset);
+ {
+ fprintf (file, ", offset ");
+ print_dec (adj->offset, file);
+ }
if (adj->by_ref)
fprintf (file, ", by_ref");
print_node_brief (file, ", type: ", adj->type, 0);