aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog5
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/loop_optimization1.adb27
-rw-r--r--gcc/testsuite/gnat.dg/loop_optimization1.ads35
-rw-r--r--gcc/tree-predcom.c3
5 files changed, 73 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f2c5442..bb29837 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 892576e..646e545 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..8875c1f
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization1.adb
@@ -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
index 0000000..2c3f419
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/loop_optimization1.ads
@@ -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;
diff --git a/gcc/tree-predcom.c b/gcc/tree-predcom.c
index 6fa80ee..dfb5342 100644
--- a/gcc/tree-predcom.c
+++ b/gcc/tree-predcom.c
@@ -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))