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-10-23 Richard Sandiford <richard.sandif...@linaro.org> Alan Hayward <alan.hayw...@arm.com> David Sherwood <david.sherw...@arm.com> gcc/ * varasm.c (addr_const::offset): Change from HOST_WIDE_INT to poly_int64. (decode_addr_const): Update accordingly. Index: gcc/varasm.c =================================================================== --- gcc/varasm.c 2017-10-23 17:11:39.974428235 +0100 +++ gcc/varasm.c 2017-10-23 17:20:52.530629696 +0100 @@ -2873,29 +2873,31 @@ assemble_real (REAL_VALUE_TYPE d, scalar 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); - 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) { offset += (tree_to_uhwi (TYPE_SIZE_UNIT (TREE_TYPE (target))) - * tree_to_shwi (TREE_OPERAND (target, 1))); + * tree_to_poly_int64 (TREE_OPERAND (target, 1))); target = TREE_OPERAND (target, 0); } else if (TREE_CODE (target) == MEM_REF @@ -3042,14 +3044,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; @@ -3242,7 +3244,7 @@ compare_constant (const tree t1, const t decode_addr_const (t1, &value1); decode_addr_const (t2, &value2); - if (value1.offset != value2.offset) + if (may_ne (value1.offset, value2.offset)) return 0; code = GET_CODE (value1.base);