tree-ssa-alias.c (nonaliasing_component_refs_p): Rename into...
* tree-ssa-alias.c (nonaliasing_component_refs_p): Rename into... (aliasing_component_refs_p): ...this. Return true if there is no common base and the base access types have the same alias set. (indirect_ref_may_alias_decl_p): Adjust for above renaming. (indirect_refs_may_alias_p): Likewise. From-SVN: r153523
This commit is contained in:
parent
26d8af3556
commit
72580319c2
@ -1,3 +1,11 @@
|
||||
2009-10-24 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* tree-ssa-alias.c (nonaliasing_component_refs_p): Rename into...
|
||||
(aliasing_component_refs_p): ...this. Return true if there is no
|
||||
common base and the base access types have the same alias set.
|
||||
(indirect_ref_may_alias_decl_p): Adjust for above renaming.
|
||||
(indirect_refs_may_alias_p): Likewise.
|
||||
|
||||
2009-10-23 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR c/40033
|
||||
|
@ -1,3 +1,7 @@
|
||||
2009-10-24 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* gnat.dg/opt4.adb: New test.
|
||||
|
||||
2009-10-23 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
PR c/40033
|
||||
|
22
gcc/testsuite/gnat.dg/opt4.adb
Normal file
22
gcc/testsuite/gnat.dg/opt4.adb
Normal file
@ -0,0 +1,22 @@
|
||||
-- { dg-do run }
|
||||
-- { dg-options "-O2" }
|
||||
|
||||
procedure Opt4 is
|
||||
|
||||
type Rec (D : Natural) is record
|
||||
S : String (1..D);
|
||||
end record;
|
||||
|
||||
procedure Test (R : Rec) is
|
||||
begin
|
||||
if R.D /= 9 then
|
||||
raise Program_Error;
|
||||
end if;
|
||||
end;
|
||||
|
||||
R : Rec(9);
|
||||
|
||||
begin
|
||||
R := (9, "123456789");
|
||||
Test (R);
|
||||
end;
|
@ -553,10 +553,10 @@ same_type_for_tbaa (tree type1, tree type2)
|
||||
on an indirect reference may alias. */
|
||||
|
||||
static bool
|
||||
nonaliasing_component_refs_p (tree ref1, tree type1,
|
||||
HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
|
||||
tree ref2, tree type2,
|
||||
HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2)
|
||||
aliasing_component_refs_p (tree ref1, tree type1,
|
||||
HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
|
||||
tree ref2, tree type2,
|
||||
HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2)
|
||||
{
|
||||
/* If one reference is a component references through pointers try to find a
|
||||
common base and apply offset based disambiguation. This handles
|
||||
@ -600,9 +600,19 @@ nonaliasing_component_refs_p (tree ref1, tree type1,
|
||||
offset1 -= offadj;
|
||||
return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
|
||||
}
|
||||
/* If we have two type access paths B1.path1 and B2.path2 they may
|
||||
only alias if either B1 is in B2.path2 or B2 is in B1.path1. */
|
||||
return false;
|
||||
|
||||
/* We haven't found any common base to apply offset-based disambiguation.
|
||||
There are two cases:
|
||||
1. The base access types have the same alias set. This can happen
|
||||
in Ada when a function with an unconstrained parameter passed by
|
||||
reference is called on a constrained object and inlined: the types
|
||||
have the same alias set but aren't equivalent. The references may
|
||||
alias in this case.
|
||||
2. The base access types don't have the same alias set, i.e. one set
|
||||
is a subset of the other. We have proved that B1 is not in the
|
||||
access path B2.path and that B2 is not in the access path B1.path
|
||||
so the references may not alias. */
|
||||
return get_alias_set (type1) == get_alias_set (type2);
|
||||
}
|
||||
|
||||
/* Return true if two memory references based on the variables BASE1
|
||||
@ -681,10 +691,10 @@ indirect_ref_may_alias_decl_p (tree ref1, tree ptr1,
|
||||
if (ref1 && ref2
|
||||
&& handled_component_p (ref1)
|
||||
&& handled_component_p (ref2))
|
||||
return nonaliasing_component_refs_p (ref1, TREE_TYPE (TREE_TYPE (ptr1)),
|
||||
offset1, max_size1,
|
||||
ref2, TREE_TYPE (base2),
|
||||
offset2, max_size2);
|
||||
return aliasing_component_refs_p (ref1, TREE_TYPE (TREE_TYPE (ptr1)),
|
||||
offset1, max_size1,
|
||||
ref2, TREE_TYPE (base2),
|
||||
offset2, max_size2);
|
||||
|
||||
return true;
|
||||
}
|
||||
@ -742,10 +752,10 @@ indirect_refs_may_alias_p (tree ref1, tree ptr1,
|
||||
if (ref1 && ref2
|
||||
&& handled_component_p (ref1)
|
||||
&& handled_component_p (ref2))
|
||||
return nonaliasing_component_refs_p (ref1, TREE_TYPE (TREE_TYPE (ptr1)),
|
||||
offset1, max_size1,
|
||||
ref2, TREE_TYPE (TREE_TYPE (ptr2)),
|
||||
offset2, max_size2);
|
||||
return aliasing_component_refs_p (ref1, TREE_TYPE (TREE_TYPE (ptr1)),
|
||||
offset1, max_size1,
|
||||
ref2, TREE_TYPE (TREE_TYPE (ptr2)),
|
||||
offset2, max_size2);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user