Commit 80d0198b by Richard Sandiford Committed by Richard Sandiford

poly_int: ipa_parm_adjustment

This patch changes the type of ipa_parm_adjustment::offset from
HOST_WIDE_INT to poly_int64 and updates uses accordingly.

2017-12-20  Richard Sandiford  <richard.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* ipa-param-manipulation.h (ipa_parm_adjustment::offset): Change from
	HOST_WIDE_INT to poly_int64_pod.
	* ipa-param-manipulation.c (ipa_modify_call_arguments): Track
	polynomail parameter offsets.

Co-Authored-By: Alan Hayward <alan.hayward@arm.com>
Co-Authored-By: David Sherwood <david.sherwood@arm.com>

From-SVN: r255885
parent 21810de4
...@@ -2,6 +2,15 @@ ...@@ -2,6 +2,15 @@
Alan Hayward <alan.hayward@arm.com> Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com> David Sherwood <david.sherwood@arm.com>
* ipa-param-manipulation.h (ipa_parm_adjustment::offset): Change from
HOST_WIDE_INT to poly_int64_pod.
* ipa-param-manipulation.c (ipa_modify_call_arguments): Track
polynomail parameter offsets.
2017-12-20 Richard Sandiford <richard.sandiford@linaro.org>
Alan Hayward <alan.hayward@arm.com>
David Sherwood <david.sherwood@arm.com>
* gengtype.c (main): Handle poly_int64_pod. * gengtype.c (main): Handle poly_int64_pod.
* dwarf2out.h (dw_cfi_oprnd_cfa_loc): New dw_cfi_oprnd_type. * dwarf2out.h (dw_cfi_oprnd_cfa_loc): New dw_cfi_oprnd_type.
(dw_cfi_oprnd::dw_cfi_cfa_loc): New field. (dw_cfi_oprnd::dw_cfi_cfa_loc): New field.
...@@ -293,15 +293,14 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt, ...@@ -293,15 +293,14 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
simply taking the address of a reference inside the original simply taking the address of a reference inside the original
aggregate. */ 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); base = gimple_call_arg (stmt, adj->base_index);
loc = DECL_P (base) ? DECL_SOURCE_LOCATION (base) loc = DECL_P (base) ? DECL_SOURCE_LOCATION (base)
: EXPR_LOCATION (base); : EXPR_LOCATION (base);
if (TREE_CODE (base) != ADDR_EXPR if (TREE_CODE (base) != ADDR_EXPR
&& POINTER_TYPE_P (TREE_TYPE (base))) && POINTER_TYPE_P (TREE_TYPE (base)))
off = build_int_cst (adj->alias_ptr_type, off = build_int_cst (adj->alias_ptr_type, byte_offset);
adj->offset / BITS_PER_UNIT);
else else
{ {
HOST_WIDE_INT base_offset; HOST_WIDE_INT base_offset;
...@@ -321,8 +320,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt, ...@@ -321,8 +320,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
if (!base) if (!base)
{ {
base = build_fold_addr_expr (prev_base); base = build_fold_addr_expr (prev_base);
off = build_int_cst (adj->alias_ptr_type, off = build_int_cst (adj->alias_ptr_type, byte_offset);
adj->offset / BITS_PER_UNIT);
} }
else if (TREE_CODE (base) == MEM_REF) else if (TREE_CODE (base) == MEM_REF)
{ {
...@@ -332,8 +330,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt, ...@@ -332,8 +330,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
deref_align = TYPE_ALIGN (TREE_TYPE (base)); deref_align = TYPE_ALIGN (TREE_TYPE (base));
} }
off = build_int_cst (adj->alias_ptr_type, off = build_int_cst (adj->alias_ptr_type,
base_offset base_offset + byte_offset);
+ adj->offset / BITS_PER_UNIT);
off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1), off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1),
off); off);
base = TREE_OPERAND (base, 0); base = TREE_OPERAND (base, 0);
...@@ -341,8 +338,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt, ...@@ -341,8 +338,7 @@ ipa_modify_call_arguments (struct cgraph_edge *cs, gcall *stmt,
else else
{ {
off = build_int_cst (adj->alias_ptr_type, off = build_int_cst (adj->alias_ptr_type,
base_offset base_offset + byte_offset);
+ adj->offset / BITS_PER_UNIT);
base = build_fold_addr_expr (base); base = build_fold_addr_expr (base);
} }
} }
...@@ -655,7 +651,7 @@ ipa_get_adjustment_candidate (tree **expr, bool *convert, ...@@ -655,7 +651,7 @@ ipa_get_adjustment_candidate (tree **expr, bool *convert,
struct ipa_parm_adjustment *adj = &adjustments[i]; struct ipa_parm_adjustment *adj = &adjustments[i];
if (adj->base == base if (adj->base == base
&& (adj->offset == offset || adj->op == IPA_PARM_OP_REMOVE)) && (known_eq (adj->offset, offset) || adj->op == IPA_PARM_OP_REMOVE))
{ {
cand = adj; cand = adj;
break; break;
...@@ -756,7 +752,10 @@ ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments, ...@@ -756,7 +752,10 @@ ipa_dump_param_adjustments (FILE *file, ipa_parm_adjustment_vec adjustments,
else if (adj->op == IPA_PARM_OP_REMOVE) else if (adj->op == IPA_PARM_OP_REMOVE)
fprintf (file, ", remove_param"); fprintf (file, ", remove_param");
else else
fprintf (file, ", offset %li", (long) adj->offset); {
fprintf (file, ", offset ");
print_dec (adj->offset, file);
}
if (adj->by_ref) if (adj->by_ref)
fprintf (file, ", by_ref"); fprintf (file, ", by_ref");
print_node_brief (file, ", type: ", adj->type, 0); print_node_brief (file, ", type: ", adj->type, 0);
......
...@@ -84,7 +84,7 @@ struct ipa_parm_adjustment ...@@ -84,7 +84,7 @@ struct ipa_parm_adjustment
/* Offset into the original parameter (for the cases when the new parameter /* Offset into the original parameter (for the cases when the new parameter
is a component of an original one). */ 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. */ /* Zero based index of the original parameter this one is based on. */
int base_index; int base_index;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment