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
This commit is contained in:
Richard Guenther 2010-11-02 17:00:09 +00:00 committed by Richard Biener
parent f26aa48e06
commit 343b2efcd7
4 changed files with 94 additions and 0 deletions

View File

@ -1,3 +1,9 @@
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

View File

@ -1,3 +1,8 @@
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

View File

@ -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];
}

View File

@ -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: