[Ada] Fix ICE with overaligned vectors on IA-64

Message ID 8138066.FpU4VBegYZ@polaris
State New
Headers show

Commit Message

Eric Botcazou Dec. 8, 2012, 11:53 a.m.
This is an internal error on IA-64 with overaligned vector types, i.e. vector 
types with alignment of 256 bits.  Because this alignment is larger than the 
largest required alignment, the testcase triggers the alignment circuitry in 
gigi and there is a small hole in it.

Tested on x86_64-suse-linux, applied on the mainline.

2012-12-08  Eric Botcazou  <ebotcazou@adacore.com>

	* gcc-interface/trans.c (Subprogram_Body_to_gnu): Be prepared for a
	by-ref VAR_DECL in the case of an Out parameter passed by copy.

2012-12-08  Eric Botcazou  <ebotcazou@adacore.com>

	* gnat.dg/vect10.ad[sb]: New test.


Index: gcc-interface/trans.c
--- gcc-interface/trans.c	(revision 194319)
+++ gcc-interface/trans.c	(working copy)
@@ -3375,16 +3375,22 @@  Subprogram_Body_to_gnu (Node_Id gnat_nod
 	if (!present_gnu_tree (gnat_param))
 	    tree gnu_cico_entry = gnu_cico_list;
+	    tree gnu_decl;
 	    /* Skip any entries that have been already filled in; they must
 	       correspond to In Out parameters.  */
 	    while (gnu_cico_entry && TREE_VALUE (gnu_cico_entry))
 	      gnu_cico_entry = TREE_CHAIN (gnu_cico_entry);
+	    /* Do any needed dereferences for by-ref objects.  */
+	    gnu_decl = gnat_to_gnu_entity (gnat_param, NULL_TREE, 1);
+	    gcc_assert (DECL_P (gnu_decl));
+	    if (DECL_BY_REF_P (gnu_decl))
+	      gnu_decl = build_unary_op (INDIRECT_REF, NULL_TREE, gnu_decl);
 	    /* Do any needed references for padded types.  */
 	    TREE_VALUE (gnu_cico_entry)
-	      = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_entry)),
-			 gnat_to_gnu_entity (gnat_param, NULL_TREE, 1));
+	      = convert (TREE_TYPE (TREE_PURPOSE (gnu_cico_entry)), gnu_decl);