From 30acf2829633b900ea5fe9a3a00aad1e9a84bf43 Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Wed, 20 Dec 2017 12:52:37 +0000 Subject: [PATCH] poly_int: fold_ctor_reference This patch changes the offset and size arguments to fold_ctor_reference from unsigned HOST_WIDE_INT to poly_uint64. 2017-12-20 Richard Sandiford Alan Hayward David Sherwood gcc/ * gimple-fold.h (fold_ctor_reference): Take the offset and size as poly_uint64 rather than unsigned HOST_WIDE_INT. * gimple-fold.c (fold_ctor_reference): Likewise. Co-Authored-By: Alan Hayward Co-Authored-By: David Sherwood From-SVN: r255869 --- gcc/ChangeLog | 8 ++++++++ gcc/gimple-fold.c | 15 ++++++++++----- gcc/gimple-fold.h | 3 +-- 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2ba9e08dfef..562907636ec 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2017-12-20 Richard Sandiford + Alan Hayward + David Sherwood + + * gimple-fold.h (fold_ctor_reference): Take the offset and size + as poly_uint64 rather than unsigned HOST_WIDE_INT. + * gimple-fold.c (fold_ctor_reference): Likewise. + 2017-12-20 Richard Sandiford Alan Hayward David Sherwood diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index 87ce3d887ce..285ece23b0e 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -6527,20 +6527,25 @@ fold_nonarray_ctor_reference (tree type, tree ctor, return build_zero_cst (type); } -/* CTOR is value initializing memory, fold reference of type TYPE and size SIZE - to the memory at bit OFFSET. */ +/* CTOR is value initializing memory, fold reference of type TYPE and + size POLY_SIZE to the memory at bit POLY_OFFSET. */ tree -fold_ctor_reference (tree type, tree ctor, unsigned HOST_WIDE_INT offset, - unsigned HOST_WIDE_INT size, tree from_decl) +fold_ctor_reference (tree type, tree ctor, poly_uint64 poly_offset, + poly_uint64 poly_size, tree from_decl) { tree ret; /* We found the field with exact match. */ if (useless_type_conversion_p (type, TREE_TYPE (ctor)) - && !offset) + && known_eq (poly_offset, 0U)) return canonicalize_constructor_val (unshare_expr (ctor), from_decl); + /* The remaining optimizations need a constant size and offset. */ + unsigned HOST_WIDE_INT size, offset; + if (!poly_size.is_constant (&size) || !poly_offset.is_constant (&offset)) + return NULL_TREE; + /* We are at the end of walk, see if we can view convert the result. */ if (!AGGREGATE_TYPE_P (TREE_TYPE (ctor)) && !offset diff --git a/gcc/gimple-fold.h b/gcc/gimple-fold.h index 83babfa4fd5..c2e9dc8b86e 100644 --- a/gcc/gimple-fold.h +++ b/gcc/gimple-fold.h @@ -44,8 +44,7 @@ extern tree follow_single_use_edges (tree); extern tree gimple_fold_stmt_to_constant_1 (gimple *, tree (*) (tree), tree (*) (tree) = no_follow_ssa_edges); extern tree gimple_fold_stmt_to_constant (gimple *, tree (*) (tree)); -extern tree fold_ctor_reference (tree, tree, unsigned HOST_WIDE_INT, - unsigned HOST_WIDE_INT, tree); +extern tree fold_ctor_reference (tree, tree, poly_uint64, poly_uint64, tree); extern tree fold_const_aggregate_ref_1 (tree, tree (*) (tree)); extern tree fold_const_aggregate_ref (tree); extern tree gimple_get_virt_method_for_binfo (HOST_WIDE_INT, tree, -- 2.30.2