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
This commit is contained in:
Eric Botcazou 2008-04-15 15:39:42 +00:00 committed by Eric Botcazou
parent b97d81535d
commit 7e80c6bf0a
5 changed files with 73 additions and 1 deletions

View 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

View 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

View File

@ -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;

View File

@ -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;

View 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))