diff mbox series

[053/nnn] poly_int: decode_addr_const

Message ID 87inf5lqy9.fsf@linaro.org
State New
Headers show
Series [053/nnn] poly_int: decode_addr_const | expand

Commit Message

Richard Sandiford Oct. 23, 2017, 5:22 p.m. UTC
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.sandiford@linaro.org>
	    Alan Hayward  <alan.hayward@arm.com>
	    David Sherwood  <david.sherwood@arm.com>

gcc/
	* varasm.c (addr_const::offset): Change from HOST_WIDE_INT
	to poly_int64.
	(decode_addr_const): Update accordingly.

Comments

Jeff Law Nov. 28, 2017, 4:52 p.m. UTC | #1
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  <richard.sandiford@linaro.org>
> 	    Alan Hayward  <alan.hayward@arm.com>
> 	    David Sherwood  <david.sherwood@arm.com>
> 
> gcc/
> 	* varasm.c (addr_const::offset): Change from HOST_WIDE_INT
> 	to poly_int64.
> 	(decode_addr_const): Update accordingly.
> 
OK
jeff
diff mbox series

Patch

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);