Re: [053/nnn] poly_int: decode_addr_const

2017-11-28 Thread Jeff Law
On 10/23/2017 11:22 AM, Richard Sandiford wrote:
> 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  
>   Alan Hayward  
>   David Sherwood  
> 
> gcc/
>   * varasm.c (addr_const::offset): Change from HOST_WIDE_INT
>   to poly_int64.
>   (decode_addr_const): Update accordingly.
> 
OK
jeff


[053/nnn] poly_int: decode_addr_const

2017-10-23 Thread Richard Sandiford
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  
Alan Hayward  
David Sherwood  

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.c2017-10-23 17:11:39.974428235 +0100
+++ gcc/varasm.c2017-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)),
+ ))
{
- 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, );
decode_addr_const (t2, );
 
-   if (value1.offset != value2.offset)
+   if (may_ne (value1.offset, value2.offset))
  return 0;
 
code = GET_CODE (value1.base);