Re: [083/nnn] poly_int: fold_indirect_ref_1

2017-11-28 Thread Jeff Law
On 10/23/2017 11:33 AM, Richard Sandiford wrote:
> This patch makes fold_indirect_ref_1 handle polynomial offsets in
> a POINTER_PLUS_EXPR.  The specific reason for doing this now is
> to handle:
> 
> (tree_to_uhwi (part_width) / BITS_PER_UNIT
>  * TYPE_VECTOR_SUBPARTS (op00type));
> 
> when TYPE_VECTOR_SUBPARTS becomes a poly_int.
> 
> 
> 2017-10-23  Richard Sandiford  
>   Alan Hayward  
>   David Sherwood  
> 
> gcc/
>   * fold-const.c (fold_indirect_ref_1): Handle polynomial offsets
>   in a POINTER_PLUS_EXPR.
OK.
jeff


[083/nnn] poly_int: fold_indirect_ref_1

2017-10-23 Thread Richard Sandiford
This patch makes fold_indirect_ref_1 handle polynomial offsets in
a POINTER_PLUS_EXPR.  The specific reason for doing this now is
to handle:

  (tree_to_uhwi (part_width) / BITS_PER_UNIT
   * TYPE_VECTOR_SUBPARTS (op00type));

when TYPE_VECTOR_SUBPARTS becomes a poly_int.


2017-10-23  Richard Sandiford  
Alan Hayward  
David Sherwood  

gcc/
* fold-const.c (fold_indirect_ref_1): Handle polynomial offsets
in a POINTER_PLUS_EXPR.

Index: gcc/fold-const.c
===
--- gcc/fold-const.c2017-10-23 17:20:50.881679906 +0100
+++ gcc/fold-const.c2017-10-23 17:22:48.984540760 +0100
@@ -14137,6 +14137,7 @@ fold_indirect_ref_1 (location_t loc, tre
 {
   tree sub = op0;
   tree subtype;
+  poly_uint64 const_op01;
 
   STRIP_NOPS (sub);
   subtype = TREE_TYPE (sub);
@@ -14191,7 +14192,7 @@ fold_indirect_ref_1 (location_t loc, tre
 }
 
   if (TREE_CODE (sub) == POINTER_PLUS_EXPR
-  && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST)
+  && poly_int_tree_p (TREE_OPERAND (sub, 1), _op01))
 {
   tree op00 = TREE_OPERAND (sub, 0);
   tree op01 = TREE_OPERAND (sub, 1);
@@ -14208,15 +14209,12 @@ fold_indirect_ref_1 (location_t loc, tre
  && type == TREE_TYPE (op00type))
{
  tree part_width = TYPE_SIZE (type);
- unsigned HOST_WIDE_INT max_offset
+ poly_uint64 max_offset
= (tree_to_uhwi (part_width) / BITS_PER_UNIT
   * TYPE_VECTOR_SUBPARTS (op00type));
- if (tree_int_cst_sign_bit (op01) == 0
- && compare_tree_int (op01, max_offset) == -1)
+ if (must_lt (const_op01, max_offset))
{
- unsigned HOST_WIDE_INT offset = tree_to_uhwi (op01);
- unsigned HOST_WIDE_INT indexi = offset * BITS_PER_UNIT;
- tree index = bitsize_int (indexi);
+ tree index = bitsize_int (const_op01 * BITS_PER_UNIT);
  return fold_build3_loc (loc,
  BIT_FIELD_REF, type, op00,
  part_width, index);
@@ -14226,8 +14224,8 @@ fold_indirect_ref_1 (location_t loc, tre
  else if (TREE_CODE (op00type) == COMPLEX_TYPE
   && type == TREE_TYPE (op00type))
{
- tree size = TYPE_SIZE_UNIT (type);
- if (tree_int_cst_equal (size, op01))
+ if (must_eq (wi::to_poly_offset (TYPE_SIZE_UNIT (type)),
+  const_op01))
return fold_build1_loc (loc, IMAGPART_EXPR, type, op00);
}
  /* ((foo *))[1] => fooarray[1] */