tree-predcom.c (suitable_reference_p): Return false if the reference can throw.
authorEric Botcazou <ebotcazou@adacore.com>
Tue, 15 Apr 2008 15:39:42 +0000 (15:39 +0000)
committerEric Botcazou <ebotcazou@gcc.gnu.org>
Tue, 15 Apr 2008 15:39:42 +0000 (15:39 +0000)
* tree-predcom.c (suitable_reference_p): Return false if the
reference can throw.

From-SVN: r134319

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gnat.dg/loop_optimization1.adb [new file with mode: 0644]
gcc/testsuite/gnat.dg/loop_optimization1.ads [new file with mode: 0644]
gcc/tree-predcom.c

index f2c5442eb7a787edea87bcbc00d25b4de68c9359..bb298373de89e33978ec334284772199b34ff9fc 100644 (file)
@@ -1,3 +1,8 @@
+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
index 892576ed4b47cca2ecefd5c7b47378b5d86b311e..646e5455e407d06840c08f64f940e629393fb936 100644 (file)
@@ -1,3 +1,7 @@
+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
diff --git a/gcc/testsuite/gnat.dg/loop_optimization1.adb b/gcc/testsuite/gnat.dg/loop_optimization1.adb
new file mode 100644 (file)
index 0000000..8875c1f
--- /dev/null
@@ -0,0 +1,27 @@
+-- { 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;
diff --git a/gcc/testsuite/gnat.dg/loop_optimization1.ads b/gcc/testsuite/gnat.dg/loop_optimization1.ads
new file mode 100644 (file)
index 0000000..2c3f419
--- /dev/null
@@ -0,0 +1,35 @@
+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;
index 6fa80ee61337e913eaae4c4fe8ad5ba1db2e1429..dfb53420e8f402c5d1bddda766bb7c07c318a95a 100644 (file)
@@ -590,7 +590,8 @@ suitable_reference_p (struct data_reference *a, enum ref_step_type *ref_step)
   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))