http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58253

--- Comment #1 from Martin Jambor <jamborm at gcc dot gnu.org> ---
I do not quite understand why the port needs to look at alignments of
scalars passed by value at all but I assume there is a reason.

When it comes to the IPA-SRA created formal parameter and actual
argument in the pr52402.c testcase, the following happens.  The
decision in which register pair the parameter is passed is made in
epiphany_function_arg_boundary.  This is reached in two different
ways:

1. When compiling foo.isra.0, indirectly from call to
   targetm.calls.function_incoming_arg at function.c:2440.  The type
   is the type of the PARM_DECL which is aligned to 8 bits.

2. When expanding the call in main, indirectly from call to
   targetm.calls.function_arg.  The type passed is the type of the
   actual argument, which is an anonymous SSA name which has the
   natural alignment of the node which is 64.

Thus, epiphany_function_arg_boundary erroneously comes to two
different conclusions.  Assuming there is nothing wrong with the
above, we can fix the problem in IPA-SRA by the patch below which sets
the type of the PARM_DECL to natural mode alignment (bootstrapped and
tested and tested on x86_64-linux, the same on ppc64 is underway).
But again, I am not really sure what the semantics of alignment of
scalar PARM_DECL is.  Nevertheless, can you please check if the patch
indeed fixes the bug?  If so, I'll post it to the mailing list for
review/further discussion.  Thanks.


2013-11-28  Martin Jambor  <mjam...@suse.cz>

    PR ipa/58253
    * ipa-prop.c (ipa_modify_formal_parameters): Create decls of
    non-BLKmode in their naturally aligned type.

diff --git a/gcc/ipa-prop.c b/gcc/ipa-prop.c
index 6bdb0df..a26b11a 100644
--- a/gcc/ipa-prop.c
+++ b/gcc/ipa-prop.c
@@ -3443,7 +3443,15 @@ ipa_modify_formal_parameters (tree fndecl,
ipa_parm_adjustment_vec adjustments)
       if (adj->by_ref)
         ptype = build_pointer_type (adj->type);
       else
-        ptype = adj->type;
+        {
+          ptype = adj->type;
+          if (TYPE_MODE (ptype) != BLKmode)
+        {
+          unsigned malign = GET_MODE_ALIGNMENT (TYPE_MODE (ptype));
+          if (TYPE_ALIGN (ptype) < malign)
+            ptype = build_aligned_type (ptype, malign);
+        }
+        }

       if (care_for_types)
         new_arg_types = tree_cons (NULL_TREE, ptype, new_arg_types);

Reply via email to