From: Richard Sandiford Date: Wed, 3 Jan 2018 07:17:12 +0000 (+0000) Subject: poly_int: fold_indirect_ref_1 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fece509bf196d58d9b31e04d816bb4ecd3f73e89;p=gcc.git poly_int: fold_indirect_ref_1 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. 2018-01-03 Richard Sandiford Alan Hayward David Sherwood gcc/ * fold-const.c (fold_indirect_ref_1): Handle polynomial offsets in a POINTER_PLUS_EXPR. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r256146 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index aede16d6602..28998830858 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-01-03 Richard Sandiford + Alan Hayward + David Sherwood + + * fold-const.c (fold_indirect_ref_1): Handle polynomial offsets + in a POINTER_PLUS_EXPR. + 2018-01-03 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/fold-const.c b/gcc/fold-const.c index f28970b2a87..e2e46005f8c 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -14049,6 +14049,7 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0) { tree sub = op0; tree subtype; + poly_uint64 const_op01; STRIP_NOPS (sub); subtype = TREE_TYPE (sub); @@ -14103,7 +14104,7 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0) } if (TREE_CODE (sub) == POINTER_PLUS_EXPR - && TREE_CODE (TREE_OPERAND (sub, 1)) == INTEGER_CST) + && poly_int_tree_p (TREE_OPERAND (sub, 1), &const_op01)) { tree op00 = TREE_OPERAND (sub, 0); tree op01 = TREE_OPERAND (sub, 1); @@ -14120,15 +14121,12 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0) && 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 (known_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); @@ -14138,8 +14136,8 @@ fold_indirect_ref_1 (location_t loc, tree type, tree op0) 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 (known_eq (wi::to_poly_offset (TYPE_SIZE_UNIT (type)), + const_op01)) return fold_build1_loc (loc, IMAGPART_EXPR, type, op00); } /* ((foo *)&fooarray)[1] => fooarray[1] */