1 From d0c1a282504a0fa941a9ae22536c73f64d8c5762 Mon Sep 17 00:00:00 2001
2 From: rguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
3 Date: Thu, 21 Apr 2011 14:40:53 +0000
4 Subject: [PATCH 162/200] 2011-04-21 Richard Guenther <rguenther@suse.de>
7 * tree-ssa-alias.c (aliasing_component_refs_p): Compute base
8 objects and types here. Adjust for their offset before
11 * g++.dg/torture/pr48695.C: New testcase.
14 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172831 138bc75d-0d04-0410-961f-82ee72b054a4
16 index e26c75d..3b0e585 100644
18 index 0000000..44e6c77
20 +++ b/gcc/testsuite/g++.dg/torture/pr48695.C
24 +typedef __SIZE_TYPE__ size_t;
26 +inline void *operator new (size_t, void *__p) throw() { return __p; }
32 + _Vector_impl () :_M_start (0), _M_finish (0) {}
37 + _Vector_impl _M_impl;
38 + int *_M_allocate (size_t __n)
40 + return __n != 0 ? new int[__n] : 0;
44 + new (this->_M_impl._M_finish) int ();
45 + this->_M_impl._M_finish =
46 + this->_M_allocate (this->_M_impl._M_finish - this->_M_impl._M_start) + 1;
53 + for (int i = 0; i <= 1; i++)
54 + for (int j = 0; j <= 1; j++)
60 diff --git a/gcc/tree-ssa-alias.c b/gcc/tree-ssa-alias.c
61 index bd8953b..8434179 100644
62 --- a/gcc/tree-ssa-alias.c
63 +++ b/gcc/tree-ssa-alias.c
64 @@ -594,11 +594,11 @@ same_type_for_tbaa (tree type1, tree type2)
65 are the respective alias sets. */
68 -aliasing_component_refs_p (tree ref1, tree type1,
69 +aliasing_component_refs_p (tree ref1,
70 alias_set_type ref1_alias_set,
71 alias_set_type base1_alias_set,
72 HOST_WIDE_INT offset1, HOST_WIDE_INT max_size1,
73 - tree ref2, tree type2,
75 alias_set_type ref2_alias_set,
76 alias_set_type base2_alias_set,
77 HOST_WIDE_INT offset2, HOST_WIDE_INT max_size2,
78 @@ -610,9 +610,21 @@ aliasing_component_refs_p (tree ref1, tree type1,
79 struct A { int i; int j; } *q;
80 struct B { struct A a; int k; } *p;
81 disambiguating q->i and p->a.j. */
87 + /* Choose bases and base types to search for. */
89 + while (handled_component_p (base1))
90 + base1 = TREE_OPERAND (base1, 0);
91 + type1 = TREE_TYPE (base1);
93 + while (handled_component_p (base2))
94 + base2 = TREE_OPERAND (base2, 0);
95 + type2 = TREE_TYPE (base2);
97 /* Now search for the type1 in the access path of ref2. This
98 would be a common base for doing offset based disambiguation on. */
100 @@ -628,6 +640,8 @@ aliasing_component_refs_p (tree ref1, tree type1,
101 HOST_WIDE_INT offadj, sztmp, msztmp;
102 get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
104 + get_ref_base_and_extent (base1, &offadj, &sztmp, &msztmp);
106 return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
108 /* If we didn't find a common base, try the other way around. */
109 @@ -644,6 +658,8 @@ aliasing_component_refs_p (tree ref1, tree type1,
110 HOST_WIDE_INT offadj, sztmp, msztmp;
111 get_ref_base_and_extent (*refp, &offadj, &sztmp, &msztmp);
113 + get_ref_base_and_extent (base2, &offadj, &sztmp, &msztmp);
115 return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
118 @@ -805,11 +821,10 @@ indirect_ref_may_alias_decl_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
119 && TREE_CODE (base1) != TARGET_MEM_REF
120 && (TREE_CODE (base1) != MEM_REF
121 || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1))
122 - return aliasing_component_refs_p (ref1, TREE_TYPE (ptrtype1),
123 + return aliasing_component_refs_p (ref1,
124 ref1_alias_set, base1_alias_set,
127 - (reference_alias_ptr_type (ref2)),
129 ref2_alias_set, base2_alias_set,
130 offset2, max_size2, true);
132 @@ -952,10 +967,10 @@ indirect_refs_may_alias_p (tree ref1 ATTRIBUTE_UNUSED, tree base1,
133 || same_type_for_tbaa (TREE_TYPE (base1), TREE_TYPE (ptrtype1)) == 1)
134 && (TREE_CODE (base2) != MEM_REF
135 || same_type_for_tbaa (TREE_TYPE (base2), TREE_TYPE (ptrtype2)) == 1))
136 - return aliasing_component_refs_p (ref1, TREE_TYPE (ptrtype1),
137 + return aliasing_component_refs_p (ref1,
138 ref1_alias_set, base1_alias_set,
140 - ref2, TREE_TYPE (ptrtype2),
142 ref2_alias_set, base2_alias_set,
143 offset2, max_size2, false);