This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR46149
- From: Richard Guenther <rguenther at suse dot de>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 2 Nov 2010 17:56:52 +0100 (CET)
- Subject: [PATCH] Fix PR46149
This fixes PR46149, we need to handle aggregate loads properly.
Bootstrapped and tested on x86_64-unknown-linux-gnu, committed.
Richard.
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.
Index: gcc/testsuite/g++.dg/torture/pr46149.C
===================================================================
*** gcc/testsuite/g++.dg/torture/pr46149.C (revision 0)
--- gcc/testsuite/g++.dg/torture/pr46149.C (revision 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];
+ }
Index: gcc/tree-ssa-structalias.c
===================================================================
*** gcc/tree-ssa-structalias.c (revision 166172)
--- gcc/tree-ssa-structalias.c (working copy)
*************** get_constraint_for_1 (tree t, VEC (ce_s,
*** 3339,3347 ****
--- 3339,3379 ----
{
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: