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