> > if (need_to_clear && maybe_gt (size, 0) && !vector) > > @@ -8058,9 +8058,9 @@ store_constructor (tree exp, rtx target, int cleared, > poly_int64 size, > > element of TARGET, determined by counting the elements. */ > > for (idx = 0, i = 0; > > vec_safe_iterate (CONSTRUCTOR_ELTS (exp), idx, &ce); > > - idx++, i += bitsize / elt_size) > > + idx++, i += exact_div (bitsize, elt_size)) > > { > > - HOST_WIDE_INT eltpos; > > + poly_int64 eltpos; > > tree value = ce->value; > > That seems incomplete. We also have > > if (ce->index) > eltpos = tree_to_uhwi (ce->index); > else > eltpos = i; > > which should use tree_to_poly_int64 then? And if .to_constant () below works, > why not use constant_multiple_p instead of exact_div? > > It seems to me the code interweaves two cases with multi-exclusive conditions > where only one is expected to have poly-ints but the changes make sure to > obfuscate this even more ... > > Note we have GIMPLE verification that vector CTOR have no holes and no > or incrementing INTEGER_CST indices unless the components are vectors > themselves in which case the CTOR has to be full and CTOR_NELTS * > subparts of element > should be known_eq to subparts of the CTOR vector type. >
Done, gcc/ChangeLog: PR target/96342 * expr.cc (store_constructor): Enable poly_{u}int64 type usage. (get_inner_reference): Ditto. Co-authored-by: Tamar Christina <tamar.christ...@arm.com> Bootstrapped Regtested on aarch64-none-linux-gnu, arm-none-linux-gnueabihf, x86_64-pc-linux-gnu -m32, -m64 and no issues. Ok for master? Thanks, Tamar -- inline copy of patch -- diff --git a/gcc/expr.cc b/gcc/expr.cc index 980ac415cfc7e2f7cf666637e756f857758688fc..4c6039c6608c0d9db3d1796eeab2129cb844433f 100644 --- a/gcc/expr.cc +++ b/gcc/expr.cc @@ -7901,15 +7901,14 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, { unsigned HOST_WIDE_INT idx; constructor_elt *ce; - int i; bool need_to_clear; insn_code icode = CODE_FOR_nothing; tree elt; tree elttype = TREE_TYPE (type); int elt_size = vector_element_bits (type); machine_mode eltmode = TYPE_MODE (elttype); - HOST_WIDE_INT bitsize; - HOST_WIDE_INT bitpos; + poly_int64 bitsize; + poly_int64 bitpos; rtvec vector = NULL; poly_uint64 n_elts; unsigned HOST_WIDE_INT const_n_elts; @@ -8006,7 +8005,7 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, ? TREE_TYPE (CONSTRUCTOR_ELT (exp, 0)->value) : elttype); if (VECTOR_TYPE_P (val_type)) - bitsize = tree_to_uhwi (TYPE_SIZE (val_type)); + bitsize = tree_to_poly_uint64 (TYPE_SIZE (val_type)); else bitsize = elt_size; @@ -8019,12 +8018,12 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, need_to_clear = true; else { - unsigned HOST_WIDE_INT count = 0, zero_count = 0; + poly_uint64 count = 0, zero_count = 0; tree value; FOR_EACH_CONSTRUCTOR_VALUE (CONSTRUCTOR_ELTS (exp), idx, value) { - int n_elts_here = bitsize / elt_size; + poly_int64 n_elts_here = exact_div (bitsize, elt_size); count += n_elts_here; if (mostly_zeros_p (value)) zero_count += n_elts_here; @@ -8033,7 +8032,7 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, /* Clear the entire vector first if there are any missing elements, or if the incidence of zero elements is >= 75%. */ need_to_clear = (maybe_lt (count, n_elts) - || 4 * zero_count >= 3 * count); + || maybe_gt (4 * zero_count, 3 * count)); } if (need_to_clear && maybe_gt (size, 0) && !vector) @@ -8060,9 +8059,13 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, /* Store each element of the constructor into the corresponding element of TARGET, determined by counting the elements. */ - for (idx = 0, i = 0; - vec_safe_iterate (CONSTRUCTOR_ELTS (exp), idx, &ce); - idx++, i += bitsize / elt_size) + HOST_WIDE_INT chunk_size = 0; + bool chunk_multiple_p = constant_multiple_p (bitsize, elt_size, + &chunk_size); + gcc_assert (chunk_multiple_p || vec_vec_init_p); + + for (idx = 0; vec_safe_iterate (CONSTRUCTOR_ELTS (exp), idx, &ce); + idx++) { HOST_WIDE_INT eltpos; tree value = ce->value; @@ -8073,7 +8076,7 @@ store_constructor (tree exp, rtx target, int cleared, poly_int64 size, if (ce->index) eltpos = tree_to_uhwi (ce->index); else - eltpos = i; + eltpos = idx * chunk_size; if (vector) { @@ -8461,10 +8464,8 @@ get_inner_reference (tree exp, poly_int64 *pbitsize, if (size_tree != 0) { - if (! tree_fits_uhwi_p (size_tree)) + if (!poly_int_tree_p (size_tree, pbitsize)) mode = BLKmode, *pbitsize = -1; - else - *pbitsize = tree_to_uhwi (size_tree); } *preversep = reverse_storage_order_for_component_p (exp);
rb19029.patch
Description: rb19029.patch