[PATCH/IPA] Fix ipa-polymorphic-call when size of Pmode is not the size of pointers in user code
Jan Hubicka
hubicka@ucw.cz
Thu Nov 20 09:05:00 GMT 2014
> 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;
> }
> }
More information about the Gcc-patches
mailing list