From 1079d2c187d78c2d3a974c42c56bb274bbde9da8 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 21 Dec 2017 07:01:52 +0000 Subject: [PATCH] poly_int: decode_addr_const This patch makes the varasm-local addr_const track polynomial offsets. I'm not sure how useful this is, but it was easier to convert than not. 2017-12-21 Richard Sandiford Alan Hayward David Sherwood gcc/ * varasm.c (addr_const::offset): Change from HOST_WIDE_INT to poly_int64. (decode_addr_const): Update accordingly. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r255927 --- gcc/ChangeLog | 8 ++++++++ gcc/varasm.c | 21 ++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a3ed3cec0b9..26b35ab7c71 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-12-21 Richard Sandiford + Alan Hayward + David Sherwood + + * varasm.c (addr_const::offset): Change from HOST_WIDE_INT + to poly_int64. + (decode_addr_const): Update accordingly. + 2017-12-21 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/varasm.c b/gcc/varasm.c index 3a53fb00e2b..2b2cde97270 100644 --- a/gcc/varasm.c +++ b/gcc/varasm.c @@ -2872,30 +2872,33 @@ assemble_real (REAL_VALUE_TYPE d, scalar_float_mode mode, unsigned int align, struct addr_const { rtx base; - HOST_WIDE_INT offset; + poly_int64 offset; }; static void decode_addr_const (tree exp, struct addr_const *value) { tree target = TREE_OPERAND (exp, 0); - HOST_WIDE_INT offset = 0; + poly_int64 offset = 0; rtx x; while (1) { + poly_int64 bytepos; if (TREE_CODE (target) == COMPONENT_REF - && tree_fits_shwi_p (byte_position (TREE_OPERAND (target, 1)))) + && poly_int_tree_p (byte_position (TREE_OPERAND (target, 1)), + &bytepos)) { - offset += int_byte_position (TREE_OPERAND (target, 1)); + offset += bytepos; target = TREE_OPERAND (target, 0); } else if (TREE_CODE (target) == ARRAY_REF || TREE_CODE (target) == ARRAY_RANGE_REF) { /* Truncate big offset. */ - offset += (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (target))) - * TREE_INT_CST_LOW (TREE_OPERAND (target, 1))); + offset + += (TREE_INT_CST_LOW (TYPE_SIZE_UNIT (TREE_TYPE (target))) + * wi::to_poly_widest (TREE_OPERAND (target, 1)).force_shwi ()); target = TREE_OPERAND (target, 0); } else if (TREE_CODE (target) == MEM_REF @@ -3040,14 +3043,14 @@ const_hash_1 (const tree exp) case SYMBOL_REF: /* Don't hash the address of the SYMBOL_REF; only use the offset and the symbol name. */ - hi = value.offset; + hi = value.offset.coeffs[0]; p = XSTR (value.base, 0); for (i = 0; p[i] != 0; i++) hi = ((hi * 613) + (unsigned) (p[i])); break; case LABEL_REF: - hi = (value.offset + hi = (value.offset.coeffs[0] + CODE_LABEL_NUMBER (label_ref_label (value.base)) * 13); break; @@ -3233,7 +3236,7 @@ compare_constant (const tree t1, const tree t2) decode_addr_const (t1, &value1); decode_addr_const (t2, &value2); - if (value1.offset != value2.offset) + if (maybe_ne (value1.offset, value2.offset)) return 0; code = GET_CODE (value1.base); -- 2.30.2