+2008-04-15 Eric Botcazou <ebotcazou@adacore.com>
+
+ * tree-predcom.c (suitable_reference_p): Return false if the
+ reference can throw.
+
2008-04-15 Jakub Jelinek <jakub@redhat.com>
PR c/35751
+2008-04-15 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/loop_optimization1.ad[sb]: New test.
+
2008-04-15 Jakub Jelinek <jakub@redhat.com>
PR c/35751
--- /dev/null
+-- { dg-do compile }
+-- { dg-options "-O3" }
+
+package body Loop_Optimization1 is
+
+ procedure Create (A : in out D; Val : Integer) is
+
+ M : constant Group_Chain_List := Group_Chains(Val);
+ G : constant Group_List := Groups(Val);
+
+ function Is_Visible (Group : Number) return Boolean is
+ begin
+ for I in M'Range loop
+ if Group = M(I).Groups(M(I).Length) then
+ return True;
+ end if;
+ end loop;
+ return False;
+ end;
+
+ begin
+ for I in A.L'Range loop
+ A.L(I) := new R(Is_Visible(G(I)));
+ end loop;
+ end;
+
+end Loop_Optimization1;
--- /dev/null
+package Loop_Optimization1 is
+
+ type Number is range 0 .. 127;
+
+ type Group_List is array (Positive range <>) of Number;
+
+ subtype Index is Natural range 1 .. 5;
+
+ function Groups (T : Integer) return Group_List;
+ pragma Import (Ada, Groups);
+
+ type Group_Chain (Length : Index := 1) is record
+ Groups : Group_List(1 .. Length);
+ end record;
+
+ type Group_Chain_List is array (Positive range <>) of Group_Chain;
+
+ function Group_Chains (T : Integer) return Group_Chain_List;
+ pragma Import (Ada, Group_Chains);
+
+ type R (I : Boolean) is null record;
+
+ type R_Access is access R;
+
+ type R_List is array (Positive range <>) of R_Access;
+
+ type R_List_Access is access R_List;
+
+ type D is record
+ L : R_List_Access;
+ end record;
+
+ procedure Create (A : in out D; Val : Integer);
+
+end Loop_Optimization1;
tree ref = DR_REF (a), step = DR_STEP (a);
if (!step
- || !is_gimple_reg_type (TREE_TYPE (ref)))
+ || !is_gimple_reg_type (TREE_TYPE (ref))
+ || tree_could_throw_p (ref))
return false;
if (integer_zerop (step))