https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68273
--- Comment #15 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Richard Biener from comment #14)
> I am currently testing the following patch to eventually mitigate the issue
> somewhat by forcing all "registers" to have non-qualified type (their
> qualification does not matter nor does their alignment). The create_tmp_reg
> hunk is more risky (in case we have bogus callers ending up forcing the
> result to memory).
>
> It will hide the PRE bug (well, still if the user wrote a 64bit aligned
> type and a 32bit aligned type PRE might change one for the other - in
> fact it will even end up using a 32bit aligned type if the code consistently
> uses 64bit aligned types).
>
> But as said earlier, the GCC implemented ABI is simply seriously broken
> if you consider the user can control "alignment" of (register-typed) values.
>
> Index: gcc/gimple-expr.c
> ===================================================================
> --- gcc/gimple-expr.c (revision 233136)
> +++ gcc/gimple-expr.c (working copy)
> @@ -484,9 +484,8 @@ create_tmp_var (tree type, const char *p
> tree
> create_tmp_reg (tree type, const char *prefix)
> {
> - tree tmp;
> -
> - tmp = create_tmp_var (type, prefix);
> + gcc_assert (is_gimple_reg_type (type));
> + tree tmp = create_tmp_var (TYPE_MAIN_VARIANT (type), prefix);
> if (TREE_CODE (type) == COMPLEX_TYPE
> || TREE_CODE (type) == VECTOR_TYPE)
> DECL_GIMPLE_REG_P (tmp) = 1;
Ok, the assert doesn't go well here. The PRE issue should be mitigated
by the tree-ssanames.c hunk already. Re-testing with a different above
variant.
> Index: gcc/tree-ssanames.c
> ===================================================================
> --- gcc/tree-ssanames.c (revision 233136)
> +++ gcc/tree-ssanames.c (working copy)
> @@ -286,7 +286,7 @@ make_ssa_name_fn (struct function *fn, t
>
> if (TYPE_P (var))
> {
> - TREE_TYPE (t) = var;
> + TREE_TYPE (t) = TYPE_MAIN_VARIANT (var);
> SET_SSA_NAME_VAR_OR_IDENTIFIER (t, NULL_TREE);
> }
> else