aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2010-11-02 17:00:09 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2010-11-02 17:00:09 +0000
commit343b2efcd766d7d56016c0ae85b6eb13d9597b9e (patch)
tree118e06f401c39f90636e55426945c6793d29860a /gcc
parentf26aa48e06db4d1e6724bfbc52ba466965719668 (diff)
downloadgcc-343b2efcd766d7d56016c0ae85b6eb13d9597b9e.zip
gcc-343b2efcd766d7d56016c0ae85b6eb13d9597b9e.tar.gz
gcc-343b2efcd766d7d56016c0ae85b6eb13d9597b9e.tar.bz2
re PR tree-optimization/46149 (26_numerics/valarray/27867.cc FAILs with -O2 -fno-tree-sra)
2010-11-02 Richard Guenther <rguenther@suse.de> PR tree-optimization/46149 * tree-ssa-structalias.c (get_constraint_for_1): Properly handle non-indirect MEM_REF variants. * g++.dg/torture/pr46149.C: New testcase. From-SVN: r166204
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/g++.dg/torture/pr46149.C51
-rw-r--r--gcc/tree-ssa-structalias.c32
4 files changed, 94 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 4a2611a..7966532 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,11 @@
2010-11-02 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/46149
+ * tree-ssa-structalias.c (get_constraint_for_1): Properly handle
+ non-indirect MEM_REF variants.
+
+2010-11-02 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/46216
* tree-ssa-forwprop.c (tree_ssa_forward_propagate_single_use_vars):
Check if we can propagate from a POINTER_PLUS_EXPR before doing so.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 32fedf6..d7135d8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,5 +1,10 @@
2010-11-02 Richard Guenther <rguenther@suse.de>
+ PR tree-optimization/46149
+ * g++.dg/torture/pr46149.C: New testcase.
+
+2010-11-02 Richard Guenther <rguenther@suse.de>
+
PR tree-optimization/46216
* gcc.dg/torture/pr46216.c: New testcase.
diff --git a/gcc/testsuite/g++.dg/torture/pr46149.C b/gcc/testsuite/g++.dg/torture/pr46149.C
new file mode 100644
index 0000000..bdc3d77
--- /dev/null
+++ b/gcc/testsuite/g++.dg/torture/pr46149.C
@@ -0,0 +1,51 @@
+// { dg-do run }
+// { dg-options "-fno-tree-sra" }
+
+struct S
+{
+ S ():p ((char *) __builtin_calloc (1, 1))
+ {
+ }
+ char *p;
+};
+
+template < class T > struct A
+{
+ A (const S & __m1, const T & __m2):m1 (__m1), m2 (__m2)
+ {
+ }
+ const S & m1;
+ const T & m2;
+};
+
+struct B:A < S >
+{
+ B (const S & __v):A < S > (__v, __v)
+ {
+ }
+};
+
+struct C:A < B >
+{
+ C (const S & __e1, const B & __e2):A < B > (__e1, __e2)
+ {
+ }
+};
+
+struct D
+{
+ D (const C & __c):c (__c)
+ {
+ }
+ const C c;
+};
+
+int
+main ()
+{
+ S s;
+ B b (s);
+ C c (s, b);
+ D d (c);
+ return d.c.m2.m2.p[0];
+}
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index ed05178..315bef6 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -3339,9 +3339,41 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
{
case MEM_REF:
{
+ struct constraint_expr *c;
+ varinfo_t vi, curr;
tree off = double_int_to_tree (sizetype, mem_ref_offset (t));
get_constraint_for_ptr_offset (TREE_OPERAND (t, 0), off, results);
do_deref (results);
+
+ /* If we are not taking the address then make sure to process
+ all subvariables we might access. */
+ c = VEC_last (ce_s, *results);
+ if (address_p
+ || c->type != SCALAR)
+ return;
+
+ vi = get_varinfo (c->var);
+ curr = vi->next;
+ if (!vi->is_full_var
+ && curr)
+ {
+ unsigned HOST_WIDE_INT size;
+ if (host_integerp (TYPE_SIZE (TREE_TYPE (t)), 1))
+ size = TREE_INT_CST_LOW (TYPE_SIZE (TREE_TYPE (t)));
+ else
+ size = -1;
+ for (; curr; curr = curr->next)
+ {
+ if (curr->offset - vi->offset < size)
+ {
+ struct constraint_expr cs = *c;
+ cs.var = curr->id;
+ VEC_safe_push (ce_s, heap, *results, &cs);
+ }
+ else
+ break;
+ }
+ }
return;
}
case ARRAY_REF: