diff mbox

Avoid bugs like PR68273 to trigger

Message ID alpine.LSU.2.11.1602150952320.1392@t29.fhfr.qr
State New
Headers show

Commit Message

Richard Biener Feb. 15, 2016, 9:05 a.m. UTC
On Sun, 14 Feb 2016, Eric Botcazou wrote:

> > No, but if there is none left why would you want to "fix" SRA?
> 
> As expected, it seems that the make_ssa_name_fn kludge is not sufficient, so 
> I'm proposing to disable the PR65310 one-liner for selected targets, using the 
> function_arg_boundary hook, until after we have a clear way out of this mess.
> 
> Here's a summary of the situation:
> 
> targhooks.c:default_function_arg_boundary		N
> aarch64/aarch64.c:aarch64_function_arg_boundary		Y
> arm/arm.c:arm_function_arg_boundary			N
> c6x/c6x.c:c6x_function_arg_boundary			Y
> epiphany/epiphany.c:epiphany_function_arg_boundary	Y
> frv/frv.c:frv_function_arg_boundary			N
> i386/i386.c:ix86_function_arg_boundary			N
> ia64/ia64.c:ia64_function_arg_boundary			Y
> iq2000/iq2000.c:iq2000_function_arg_boundary		Y
> m32c/m32c.c:m32c_function_arg_boundary			N
> mcore/mcore.c:mcore_function_arg_boundary		N
> mips/mips.c:mips_function_arg_boundary			Y
> msp430/msp430.c:msp430_function_arg_boundary		N
> nds32/nds32.c:nds32_function_arg_boundary		Y
> pa/pa.c:pa_function_arg_boundary			N
> rl78/rl78.c:rl78_function_arg_boundary			N
> rs6000/rs6000.c:rs6000_function_arg_boundary		Y (aggr, AIX/ELFv2)
> rx/rx.c:rx_function_arg_boundary			Y
> sparc/sparc.c:sparc_function_arg_boundary		Y (64-bit)
> tilegx/tilegx.c:tilegx_function_arg_boundary		Y
> tilepro/tilepro.c:tilepro_function_arg_boundary		Y
> xtensa/xtensa.c:xtensa_function_arg_boundary		Y
> 
> A 'Y' means that the return value of function_arg_boundary depends on the 
> alignment of the type it is directly passed (e.g. not on its main variant).
> 'aggr' means for aggregate types only, the other modifiers are ABIs.
> 
> So if we add a test based on function_arg_boundary, we'll effectively disable 
> the PR65310 one-liner in some cases for the following targets:
> aarch64, c6x, epiphany, ia64, iq2000, mips, nds32, rs6000 (aggr), rx, sparc,
> tilegx, tilepro, xtensa
> 
> If we additionally test STRICT_ALIGNMENT, the set of targets shrinks to:
> c6x, epiphany, ia64, iq2000, mips, nds32, sparc, tilegx, tilepro, xtensa
> 
> MIPS being in both sets, this will fix PR68273 in both cases.

I agree with Jakub on this (obviously), still a comment on the patch:

> Index: tree-sra.c
> ===================================================================
> --- tree-sra.c  (revision 233338)
> +++ tree-sra.c  (working copy)
> @@ -1681,9 +1681,22 @@ build_ref_for_offset (location_t loc, tr
>    misalign = (misalign + offset) & (align - 1);
>    if (misalign != 0)
>      align = (misalign & -misalign);
> -  if (align != TYPE_ALIGN (exp_type))
> +
> +  /* Misaligning a type is generally OK (if it's naturally aligned).  */
> +  if (align < TYPE_ALIGN (exp_type))
>      exp_type = build_aligned_type (exp_type, align);

So you simply assume that exp_type is naturally aligned here.  I think
you should test align < TYPE_ALIGN (TYPE_MAIN_VARIANT (exp_type)) here, 
no?

> +  /* Overaligning it can be problematic because of calling conventions.  */
> +  else if (align > TYPE_ALIGN (exp_type))
> +    {
> +      tree aligned_type = build_aligned_type (exp_type, align);
> +      if (targetm.calls.function_arg_boundary (TYPE_MODE (aligned_type),
> +                                              aligned_type)
> +         == targetm.calls.function_arg_boundary (TYPE_MODE (exp_type),
> +                                                 exp_type))

And if you get enough supporters to apply this kind of workaround
I'd prefer it to be in build_aligned_type itself, basically
refusing to build over-aligned types.  And I'd rather make this
controlled by an internal flag that backends should consciously
set (aka a target hook).  The above is simply a bit too ugly IMHO
and looks incomplete(?), cannot even the cummulative args machinery
end up with type-align specifics or are you sure those can only
be triggered from function_arg_boundary?

Note the real issue is overaligned register types.  I've tried

so you should be able to point to a specific pass doing the wreckage
and provide preprocessed source and a cross-compiler setup to
investigate.

> +       exp_type = aligned_type;
> +    }
> +
>    mem_ref = fold_build2_loc (loc, MEM_REF, exp_type, base, off);
>    REF_REVERSE_STORAGE_ORDER (mem_ref) = reverse;
>    if (TREE_THIS_VOLATILE (prev_base))
> Index: tree-ssanames.c
> ===================================================================
> --- tree-ssanames.c     (revision 233338)
> +++ tree-ssanames.c     (working copy)
> @@ -286,7 +286,7 @@ make_ssa_name_fn (struct function *fn, t
>  
>    if (TYPE_P (var))
>      {
> -      TREE_TYPE (t) = TYPE_MAIN_VARIANT (var);
> +      TREE_TYPE (t) = var;
>        SET_SSA_NAME_VAR_OR_IDENTIFIER (t, NULL_TREE);
>      }
>    else

Note that this change was desirable on its own as this is how I expect
types to end up in the middle-end after we fix LTO debug and thus
can free more of the "language specific" type pieces in the middle-end.

Richard.

Comments

Eric Botcazou Feb. 19, 2016, 8:29 a.m. UTC | #1
> So you simply assume that exp_type is naturally aligned here.  I think
> you should test align < TYPE_ALIGN (TYPE_MAIN_VARIANT (exp_type)) here,
> no?

No strong opinion, but the patch is only intended to mitigate the effects of 
the PR65310 one-liner, including on the 5 branch, so it's minimal.

> And if you get enough supporters to apply this kind of workaround
> I'd prefer it to be in build_aligned_type itself, basically
> refusing to build over-aligned types.

I pondered that but rejected it for the 5 branch.

> And I'd rather make this controlled by an internal flag that backends should
> consciously set (aka a target hook).

I disagree, the onus is on the middle-end to fix its mess and the default 
should not be to generate wrong code in any case.

> The above is simply a bit too ugly IMHO
> and looks incomplete(?), cannot even the cummulative args machinery
> end up with type-align specifics or are you sure those can only
> be triggered from function_arg_boundary?

I think that testing function_arg_boundary is a conservative criterion, but I 
admittedly didn't check every architecture.

> Note the real issue is overaligned register types.

Agreed, and IMO the middle-end should not create them out of nowhere.

> At least it seems you have a testcase that reproduces the error
> so you should be able to point to a specific pass doing the wreckage
> and provide preprocessed source and a cross-compiler setup to
> investigate.

I'm just using Jeff's reduced testcase for MIPS.
Richard Biener Feb. 19, 2016, 8:36 a.m. UTC | #2
On Fri, 19 Feb 2016, Eric Botcazou wrote:

> > So you simply assume that exp_type is naturally aligned here.  I think
> > you should test align < TYPE_ALIGN (TYPE_MAIN_VARIANT (exp_type)) here,
> > no?
> 
> No strong opinion, but the patch is only intended to mitigate the effects of 
> the PR65310 one-liner, including on the 5 branch, so it's minimal.
> 
> > And if you get enough supporters to apply this kind of workaround
> > I'd prefer it to be in build_aligned_type itself, basically
> > refusing to build over-aligned types.
> 
> I pondered that but rejected it for the 5 branch.
> 
> > And I'd rather make this controlled by an internal flag that backends should
> > consciously set (aka a target hook).
> 
> I disagree, the onus is on the middle-end to fix its mess and the default 
> should not be to generate wrong code in any case.
> 
> > The above is simply a bit too ugly IMHO
> > and looks incomplete(?), cannot even the cummulative args machinery
> > end up with type-align specifics or are you sure those can only
> > be triggered from function_arg_boundary?
> 
> I think that testing function_arg_boundary is a conservative criterion, but I 
> admittedly didn't check every architecture.
> 
> > Note the real issue is overaligned register types.
> 
> Agreed, and IMO the middle-end should not create them out of nowhere.

Yup, so we should make sure we don't (even not "out of nowhere").  See
my attempts on adding some SSA verification for this (needs to be
restricted to overaligned, then it doesn't trigger that often...).
One issue is that we've often got DECLs that are overaligned but at
some point re-write them into SSA - and the SSA verifier expects the
SSA name types to agree with their decls type.  I didn't yet try to
fixup DECL alignment to be natural as we re-write it into SSA but
I believe that may be necessary in the end to make such SSA verification
not trigger.

> > At least it seems you have a testcase that reproduces the error
> > so you should be able to point to a specific pass doing the wreckage
> > and provide preprocessed source and a cross-compiler setup to
> > investigate.
> 
> I'm just using Jeff's reduced testcase for MIPS.

See the bug where I fixed up some more places in SRA after debugging
a cross to MIPS with the reduced testcase (fixing verification fails
with added SSA alignment checking).

Richard.
Bernd Schmidt Feb. 19, 2016, 12:32 p.m. UTC | #3
On 02/19/2016 09:36 AM, Richard Biener wrote:
> Yup, so we should make sure we don't (even not "out of nowhere").  See
> my attempts on adding some SSA verification for this (needs to be
> restricted to overaligned, then it doesn't trigger that often...).
> One issue is that we've often got DECLs that are overaligned but at
> some point re-write them into SSA - and the SSA verifier expects the
> SSA name types to agree with their decls type.

Sounds like the verifier needs to be relaxed a little?


Bernd
Richard Biener Feb. 19, 2016, 12:42 p.m. UTC | #4
On Fri, 19 Feb 2016, Bernd Schmidt wrote:

> On 02/19/2016 09:36 AM, Richard Biener wrote:
> > Yup, so we should make sure we don't (even not "out of nowhere").  See
> > my attempts on adding some SSA verification for this (needs to be
> > restricted to overaligned, then it doesn't trigger that often...).
> > One issue is that we've often got DECLs that are overaligned but at
> > some point re-write them into SSA - and the SSA verifier expects the
> > SSA name types to agree with their decls type.
> 
> Sounds like the verifier needs to be relaxed a little?

No, we really use those two types interchangeably.  If it's
a DECL_INGORED var adjusting it is fine I think, but if it's a
user var we'd drop some debug info (do we actually emit alignment
info?) and if it's a PARM_DECL then it may change the ABI
(in which case their SSA names maybe should have overaligned type...)

Richard.

> 
> Bernd
> 
>
Jakub Jelinek Feb. 19, 2016, 12:50 p.m. UTC | #5
On Fri, Feb 19, 2016 at 01:42:20PM +0100, Richard Biener wrote:
> On Fri, 19 Feb 2016, Bernd Schmidt wrote:
> 
> > On 02/19/2016 09:36 AM, Richard Biener wrote:
> > > Yup, so we should make sure we don't (even not "out of nowhere").  See
> > > my attempts on adding some SSA verification for this (needs to be
> > > restricted to overaligned, then it doesn't trigger that often...).
> > > One issue is that we've often got DECLs that are overaligned but at
> > > some point re-write them into SSA - and the SSA verifier expects the
> > > SSA name types to agree with their decls type.
> > 
> > Sounds like the verifier needs to be relaxed a little?
> 
> No, we really use those two types interchangeably.  If it's
> a DECL_INGORED var adjusting it is fine I think, but if it's a
> user var we'd drop some debug info (do we actually emit alignment

I think we don't right now, but DWARF5 is going to have attributes for this,
so we'll start soon.

> info?) and if it's a PARM_DECL then it may change the ABI
> (in which case their SSA names maybe should have overaligned type...)

	Jakub
diff mbox

Patch

Index: tree-ssa.c
===================================================================
--- tree-ssa.c  (revision 233369)
+++ tree-ssa.c  (working copy)
@@ -936,6 +936,22 @@  verify_ssa (bool check_modified_stmt, bo
                              name, stmt, virtual_operand_p (name)))
                goto err;
            }
+
+         if (! SSA_NAME_VAR (name)
+             && TYPE_MAIN_VARIANT (TREE_TYPE (name)) != TREE_TYPE (name))
+           {
+             error ("type is not main variant");
+             goto err;
+           }
+

but that's not too happy (to verify the change below).  But verifying
we don't have over-aligned (or under-aligned) registers would be a good 
thing and I think all registers should have main-variant types.

So I'd rather nail down the case that still gets through with the
below patch using sth like the above (well, as said, adjust it
to check all SSA names and TYPE_ALING == TYPE_ALIGN (TYPE_MAIN_VARIANT 
())).

At least it seems you have a testcase that reproduces the error