From 7e80c6bf0ac19530a971c4d104f5e6a91dc81cb1 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Tue, 15 Apr 2008 15:39:42 +0000 Subject: [PATCH] tree-predcom.c (suitable_reference_p): Return false if the reference can throw. * tree-predcom.c (suitable_reference_p): Return false if the reference can throw. From-SVN: r134319 --- gcc/ChangeLog | 5 +++ gcc/testsuite/ChangeLog | 4 +++ gcc/testsuite/gnat.dg/loop_optimization1.adb | 27 +++++++++++++++ gcc/testsuite/gnat.dg/loop_optimization1.ads | 35 ++++++++++++++++++++ gcc/tree-predcom.c | 3 +- 5 files changed, 73 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gnat.dg/loop_optimization1.adb create mode 100644 gcc/testsuite/gnat.dg/loop_optimization1.ads diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2c5442eb7a..bb298373de8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-04-15 Eric Botcazou + + * tree-predcom.c (suitable_reference_p): Return false if the + reference can throw. + 2008-04-15 Jakub Jelinek PR c/35751 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 892576ed4b4..646e5455e40 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-04-15 Eric Botcazou + + * gnat.dg/loop_optimization1.ad[sb]: New test. + 2008-04-15 Jakub Jelinek 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 00000000000..8875c1f8d81 --- /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 00000000000..2c3f419b50d --- /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 6fa80ee6133..dfb53420e8f 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)) -- 2.30.2