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