From f7ed31955b00970413b202e0b4c3144aeec136d5 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 21 Dec 2017 07:02:20 +0000 Subject: [PATCH] poly_int: build_ref_for_offset This patch changes the offset parameter to build_ref_for_offset from HOST_WIDE_INT to poly_int64. 2017-12-21 Richard Sandiford Alan Hayward David Sherwood gcc/ * ipa-prop.h (build_ref_for_offset): Take the offset as a poly_int64 rather than a HOST_WIDE_INT. * tree-sra.c (build_ref_for_offset): Likewise. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r255931 --- gcc/ChangeLog | 8 ++++++++ gcc/ipa-prop.h | 2 +- gcc/tree-sra.c | 17 ++++++++--------- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2bdcde16a21..d206c340fb1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-12-21 Richard Sandiford + Alan Hayward + David Sherwood + + * ipa-prop.h (build_ref_for_offset): Take the offset as a poly_int64 + rather than a HOST_WIDE_INT. + * tree-sra.c (build_ref_for_offset): Likewise. + 2017-12-21 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/ipa-prop.h b/gcc/ipa-prop.h index c3624052bbc..2b3ea68c5fb 100644 --- a/gcc/ipa-prop.h +++ b/gcc/ipa-prop.h @@ -785,7 +785,7 @@ void ipa_release_body_info (struct ipa_func_body_info *); tree ipa_get_callee_param_type (struct cgraph_edge *e, int i); /* From tree-sra.c: */ -tree build_ref_for_offset (location_t, tree, HOST_WIDE_INT, bool, tree, +tree build_ref_for_offset (location_t, tree, poly_int64, bool, tree, gimple_stmt_iterator *, bool); /* In ipa-cp.c */ diff --git a/gcc/tree-sra.c b/gcc/tree-sra.c index 93de0442a80..d7112a812dc 100644 --- a/gcc/tree-sra.c +++ b/gcc/tree-sra.c @@ -1706,7 +1706,7 @@ make_fancy_name (tree expr) of handling bitfields. */ tree -build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset, +build_ref_for_offset (location_t loc, tree base, poly_int64 offset, bool reverse, tree exp_type, gimple_stmt_iterator *gsi, bool insert_after) { @@ -1724,7 +1724,7 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset, TYPE_QUALS (exp_type) | ENCODE_QUAL_ADDR_SPACE (as)); - gcc_checking_assert (offset % BITS_PER_UNIT == 0); + poly_int64 byte_offset = exact_div (offset, BITS_PER_UNIT); get_object_alignment_1 (base, &align, &misalign); base = get_addr_base_and_unit_offset (base, &base_offset); @@ -1746,27 +1746,26 @@ build_ref_for_offset (location_t loc, tree base, HOST_WIDE_INT offset, else gsi_insert_before (gsi, stmt, GSI_SAME_STMT); - off = build_int_cst (reference_alias_ptr_type (prev_base), - offset / BITS_PER_UNIT); + off = build_int_cst (reference_alias_ptr_type (prev_base), byte_offset); base = tmp; } else if (TREE_CODE (base) == MEM_REF) { off = build_int_cst (TREE_TYPE (TREE_OPERAND (base, 1)), - base_offset + offset / BITS_PER_UNIT); + base_offset + byte_offset); off = int_const_binop (PLUS_EXPR, TREE_OPERAND (base, 1), off); base = unshare_expr (TREE_OPERAND (base, 0)); } else { off = build_int_cst (reference_alias_ptr_type (prev_base), - base_offset + offset / BITS_PER_UNIT); + base_offset + byte_offset); base = build_fold_addr_expr (unshare_expr (base)); } - misalign = (misalign + offset) & (align - 1); - if (misalign != 0) - align = least_bit_hwi (misalign); + unsigned int align_bound = known_alignment (misalign + offset); + if (align_bound != 0) + align = MIN (align, align_bound); if (align != TYPE_ALIGN (exp_type)) exp_type = build_aligned_type (exp_type, align); -- 2.30.2