]> code.ossystems Code Review - openembedded-core.git/blob
482f1dc2a83c11761adc265bd2c7592487ceb371
[openembedded-core.git] /
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>
5
6         PR middle-end/48695
7         * tree-ssa-alias.c (aliasing_component_refs_p): Compute base
8         objects and types here.  Adjust for their offset before
9         comparing.
10
11         * g++.dg/torture/pr48695.C: New testcase.
12
13
14 git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_6-branch@172831 138bc75d-0d04-0410-961f-82ee72b054a4
15
16 index e26c75d..3b0e585 100644
17 new file mode 100644
18 index 0000000..44e6c77
19 --- /dev/null
20 +++ b/gcc/testsuite/g++.dg/torture/pr48695.C
21 @@ -0,0 +1,38 @@
22 +// { dg-do run }
23 +
24 +typedef __SIZE_TYPE__ size_t;
25 +
26 +inline void *operator new (size_t, void *__p) throw() { return __p; }
27 +
28 +struct _Vector_impl
29 +{
30 +  int *_M_start;
31 +  int *_M_finish;
32 +  _Vector_impl () :_M_start (0), _M_finish (0) {}
33 +};
34 +
35 +struct vector
36 +{
37 +  _Vector_impl _M_impl;
38 +  int *_M_allocate (size_t __n)
39 +  {
40 +    return __n != 0 ? new int[__n] : 0;
41 +  }
42 +  void push_back ()
43 +  {
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;
47 +  }
48 +};
49 +
50 +int
51 +main ()
52 +{
53 +  for (int i = 0; i <= 1; i++)
54 +    for (int j = 0; j <= 1; j++)
55 +      {
56 +       vector a[2];
57 +       a[i].push_back ();
58 +      }
59 +}
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.  */
66  
67  static bool
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,
74 +                          tree ref2,
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.  */
82 +  tree base1, base2;
83 +  tree type1, type2;
84    tree *refp;
85    int same_p;
86  
87 +  /* Choose bases and base types to search for.  */
88 +  base1 = ref1;
89 +  while (handled_component_p (base1))
90 +    base1 = TREE_OPERAND (base1, 0);
91 +  type1 = TREE_TYPE (base1);
92 +  base2 = ref2;
93 +  while (handled_component_p (base2))
94 +    base2 = TREE_OPERAND (base2, 0);
95 +  type2 = TREE_TYPE (base2);
96 +
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.  */
99    refp = &ref2;
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);
103        offset2 -= offadj;
104 +      get_ref_base_and_extent (base1, &offadj, &sztmp, &msztmp);
105 +      offset1 -= offadj;
106        return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
107      }
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);
112        offset1 -= offadj;
113 +      get_ref_base_and_extent (base2, &offadj, &sztmp, &msztmp);
114 +      offset2 -= offadj;
115        return ranges_overlap_p (offset1, max_size1, offset2, max_size2);
116      }
117  
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,
125                                       offset1, max_size1,
126 -                                     ref2, TREE_TYPE
127 -                                             (reference_alias_ptr_type (ref2)),
128 +                                     ref2,
129                                       ref2_alias_set, base2_alias_set,
130                                       offset2, max_size2, true);
131  
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,
139                                       offset1, max_size1,
140 -                                     ref2, TREE_TYPE (ptrtype2),
141 +                                     ref2,
142                                       ref2_alias_set, base2_alias_set,
143                                       offset2, max_size2, false);
144  
145 -- 
146 1.7.0.4
147