> 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;
>       }
>      }

Reply via email to