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