[PATCH] Avoid bugs like PR68273 to trigger

Eric Botcazou ebotcazou@adacore.com
Sun Feb 14 20:40:00 GMT 2016

> 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.

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);
+  /* 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))
+       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;

Eric Botcazou

More information about the Gcc-patches mailing list