This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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


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.


-- 
Eric Botcazou
-- { dg-do compile }

package body Vect10 is

   procedure Add_Mul (X : in out Unit; Y, Z : in Unit) is
   begin
       X := X + Y * Z;
   end;
   pragma Inline_Always (Add_Mul);

   procedure Proc
     (F           : in Rec_Vector;
      First_Index : in Natural;
      Last_Index  : in Natural;
      Result      : out Unit)
   is
   begin
      Result := (others => 0.0);

      for I in First_Index + 1 .. Last_Index loop
         declare
            Local : Rec renames F (I);
         begin
            Add_Mul (Result, Local.Val, Local.Val);
         end;
      end loop;
   end;

end Vect10;
with Vect9_Pkg; use Vect9_Pkg;

package Vect10 is

   type Rec is record
      Val : Unit;
   end record;

   type Rec_Vector is array (Positive range <>) of Rec;

   procedure Proc
     (F            : in Rec_Vector;
      First_Index : in Natural;
      Last_Index  : in Natural;
      Result      : out Unit);

end Vect10;
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);
 	  }
     }
   else

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]