> Hi, > For ILP32 on AARCH64, we have ptr_mode != Pmode (we have ptr_mode > being SImode while Pmode is DImode and POINTER_SIZE is 32). This > breaks ipa-polymorphic-call assumption that Pmode is the correct mode > for pointers. Right now before this patch we get many testcase > failures in the C++ testsuite due to this. Some of the tests fail due > to the wrong devirtualization happening (using the base class rather > the current class). > > This patch fixes the issue by using POINTER_SIZE in place of > GET_MODE_BITSIZE (Pmode) all over the file. > > OK? Bootstrapped and tested on x86_64 and cross built and tested for > aarch64-elf with no regressions. > > Thanks, > Andrew Pinski > > ChangeLog: > ipa/63981 > * ipa-polymorphic-call.c (possible_placement_new): > Use POINTER_SIZE instead of GET_MODE_BITSIZE (Pmode). > (ipa_polymorphic_call_context::restrict_to_inner_class): Likewise. > (extr_type_from_vtbl_ptr_store): Likewise.
OK, thanks! Honza > diff --git a/gcc/ipa-polymorphic-call.c b/gcc/ipa-polymorphic-call.c > index 452f2d2..a746c49 100644 > --- a/gcc/ipa-polymorphic-call.c > +++ b/gcc/ipa-polymorphic-call.c > @@ -112,7 +112,7 @@ possible_placement_new (tree type, tree expected_type, > || !tree_fits_shwi_p (TYPE_SIZE (type)) > || (cur_offset > + (expected_type ? tree_to_uhwi (TYPE_SIZE (expected_type)) > - : GET_MODE_BITSIZE (Pmode)) > + : POINTER_SIZE) > <= tree_to_uhwi (TYPE_SIZE (type))))); > } > > @@ -155,7 +155,7 @@ ipa_polymorphic_call_context::restrict_to_inner_class > (tree otr_type, > HOST_WIDE_INT cur_offset = offset; > bool speculative = false; > bool size_unknown = false; > - unsigned HOST_WIDE_INT otr_type_size = GET_MODE_BITSIZE (Pmode); > + unsigned HOST_WIDE_INT otr_type_size = POINTER_SIZE; > > /* Update OUTER_TYPE to match EXPECTED_TYPE if it is not set. */ > if (!outer_type) > @@ -316,7 +316,7 @@ ipa_polymorphic_call_context::restrict_to_inner_class > (tree otr_type, > > if (pos <= (unsigned HOST_WIDE_INT)cur_offset > && (pos + size) >= (unsigned HOST_WIDE_INT)cur_offset > - + GET_MODE_BITSIZE (Pmode) > + + POINTER_SIZE > && (!otr_type > || !TYPE_SIZE (TREE_TYPE (fld)) > || !tree_fits_shwi_p (TYPE_SIZE (TREE_TYPE (fld))) > @@ -1243,7 +1243,7 @@ extr_type_from_vtbl_ptr_store (gimple stmt, struct > type_change_info *tci, > print_generic_expr (dump_file, tci->instance, TDF_SLIM); > fprintf (dump_file, " with offset %i\n", (int)tci->offset); > } > - return tci->offset > GET_MODE_BITSIZE (Pmode) ? error_mark_node : > NULL_TREE; > + return tci->offset > POINTER_SIZE ? error_mark_node : NULL_TREE; > } > if (offset != tci->offset > || size != POINTER_SIZE > @@ -1252,9 +1252,9 @@ extr_type_from_vtbl_ptr_store (gimple stmt, struct > type_change_info *tci, > if (dump_file) > fprintf (dump_file, " wrong offset %i!=%i or size %i\n", > (int)offset, (int)tci->offset, (int)size); > - return offset + GET_MODE_BITSIZE (Pmode) <= tci->offset > + return offset + POINTER_SIZE <= tci->offset > || (max_size != -1 > - && tci->offset + GET_MODE_BITSIZE (Pmode) > offset + > max_size) > + && tci->offset + POINTER_SIZE > offset + max_size) > ? error_mark_node : NULL; > } > }