This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug ada/43096] [4.5 regression] miscompilation of ACATS c37105a at -O2
- From: "rguenther at suse dot de" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 26 Feb 2010 19:56:45 -0000
- Subject: [Bug ada/43096] [4.5 regression] miscompilation of ACATS c37105a at -O2
- References: <bug-43096-7210@http.gcc.gnu.org/bugzilla/>
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
------- Comment #7 from rguenther at suse dot de 2010-02-26 19:56 -------
Subject: Re: [4.5 regression] miscompilation of ACATS c37105a
at -O2
On Fri, 26 Feb 2010, ebotcazou at gcc dot gnu dot org wrote:
>
>
> ------- Comment #6 from ebotcazou at gcc dot gnu dot org 2010-02-26 17:46 -------
> > We might be able to save the day with the help of TYPE_CANONICAL in this case
> > since the size is fixed.
>
> TYPE_CANONICAL is too strong, it will cause useless_type_conversion_p to return
> true for conversions between type and subtypes and, even with fixed size, these
> conversions aren't useless. So we need this for Ada:
>
> Index: tree-ssa-alias.c
> ===================================================================
> --- tree-ssa-alias.c (revision 156989)
> +++ tree-ssa-alias.c (working copy)
> @@ -544,13 +544,15 @@ same_type_for_tbaa (tree type1, tree typ
> && TREE_CODE (type2) == ARRAY_TYPE)
> return -1;
>
> - /* In Ada, an lvalue of unconstrained type can be used to access an object
> - of one of its constrained subtypes, for example when a function with an
> - unconstrained parameter passed by reference is called on a constrained
> - object and inlined. In this case, the types have the same alias set. */
> - if (TYPE_SIZE (type1) && TYPE_SIZE (type2)
> - && TREE_CONSTANT (TYPE_SIZE (type1)) != TREE_CONSTANT (TYPE_SIZE
> (type2))
> - && get_alias_set (type1) == get_alias_set (type2))
> + /* ??? In Ada, an lvalue of an unconstrained type can be used to access an
> + object of one of its constrained subtypes, e.g. when a function with an
> + unconstrained parameter passed by reference is called on an object and
> + inlined. But, even in the case of a fixed size, type and subtypes are
> + not equivalent enough as to share the same TYPE_CANONICAL, since this
> + would mean that conversions between them are useless, whereas they are
> + not (e.g. type and subtypes can have different modes). So, in the end,
> + they are only guaranteed to have the same alias set. */
> + if (get_alias_set (type1) == get_alias_set (type2))
> return -1;
>
> /* The types are known to be not equal. */
>
>
> The change doesn't introduce any regressions in the C/C++ testsuite on x86 so
> it might not be a big pessimization.
>
> Richard, what do you think?
Looks reasonable.
Richard.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43096