Commit b4cf8c9d by Richard Guenther Committed by Richard Biener

re PR tree-optimization/49651 (nested lambdas and -O3 produced incorrect integer…

re PR tree-optimization/49651 (nested lambdas and -O3 produced incorrect integer variable increments)

2012-01-04  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/49651
	* tree-ssa-structalias.c (type_can_have_subvars): New function.
	(var_can_have_subvars): Use it.
	(get_constraint_for_1): Only consider subfields if there
	can be any.

	* gcc.dg/tree-ssa/pta-ptrarith-1.c: Adjust.
	* gcc.dg/tree-ssa/pta-ptrarith-2.c: Likewise.

From-SVN: r182865
parent 53618d02
2012-01-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49651
* tree-ssa-structalias.c (type_can_have_subvars): New function.
(var_can_have_subvars): Use it.
(get_constraint_for_1): Only consider subfields if there
can be any.
2012-01-03 Jakub Jelinek <jakub@redhat.com> 2012-01-03 Jakub Jelinek <jakub@redhat.com>
PR bootstrap/51725 PR bootstrap/51725
2012-01-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/49651
* gcc.dg/tree-ssa/pta-ptrarith-1.c: Adjust.
* gcc.dg/tree-ssa/pta-ptrarith-2.c: Likewise.
2012-01-03 Paolo Carlini <paolo.carlini@oracle.com> 2012-01-03 Paolo Carlini <paolo.carlini@oracle.com>
PR c++/51738 PR c++/51738
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */ /* { dg-options "-O2 -fno-tree-forwprop -fno-tree-ccp -fdump-tree-ealias" } */
extern void abort (void); extern void abort (void);
struct X { struct X {
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-O2 -fno-tree-ccp -fdump-tree-ealias" } */ /* { dg-options "-O2 -fno-tree-forwprop -fno-tree-ccp -fdump-tree-ealias" } */
extern void abort (void); extern void abort (void);
struct X { struct X {
......
...@@ -303,6 +303,7 @@ static varinfo_t first_vi_for_offset (varinfo_t, unsigned HOST_WIDE_INT); ...@@ -303,6 +303,7 @@ static varinfo_t first_vi_for_offset (varinfo_t, unsigned HOST_WIDE_INT);
static varinfo_t first_or_preceding_vi_for_offset (varinfo_t, static varinfo_t first_or_preceding_vi_for_offset (varinfo_t,
unsigned HOST_WIDE_INT); unsigned HOST_WIDE_INT);
static varinfo_t lookup_vi_for_tree (tree); static varinfo_t lookup_vi_for_tree (tree);
static inline bool type_can_have_subvars (const_tree);
/* Pool of variable info structures. */ /* Pool of variable info structures. */
static alloc_pool variable_info_pool; static alloc_pool variable_info_pool;
...@@ -3275,7 +3276,8 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p, ...@@ -3275,7 +3276,8 @@ get_constraint_for_1 (tree t, VEC (ce_s, heap) **results, bool address_p,
return; return;
cs = *VEC_last (ce_s, *results); cs = *VEC_last (ce_s, *results);
if (cs.type == DEREF) if (cs.type == DEREF
&& type_can_have_subvars (TREE_TYPE (t)))
{ {
/* For dereferences this means we have to defer it /* For dereferences this means we have to defer it
to solving time. */ to solving time. */
...@@ -5043,6 +5045,15 @@ sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack) ...@@ -5043,6 +5045,15 @@ sort_fieldstack (VEC(fieldoff_s,heap) *fieldstack)
VEC_qsort (fieldoff_s, fieldstack, fieldoff_compare); VEC_qsort (fieldoff_s, fieldstack, fieldoff_compare);
} }
/* Return true if T is a type that can have subvars. */
static inline bool
type_can_have_subvars (const_tree t)
{
/* Aggregates without overlapping fields can have subvars. */
return TREE_CODE (t) == RECORD_TYPE;
}
/* Return true if V is a tree that we can have subvars for. /* Return true if V is a tree that we can have subvars for.
Normally, this is any aggregate type. Also complex Normally, this is any aggregate type. Also complex
types which are not gimple registers can have subvars. */ types which are not gimple registers can have subvars. */
...@@ -5058,11 +5069,7 @@ var_can_have_subvars (const_tree v) ...@@ -5058,11 +5069,7 @@ var_can_have_subvars (const_tree v)
if (!DECL_P (v)) if (!DECL_P (v))
return false; return false;
/* Aggregates without overlapping fields can have subvars. */ return type_can_have_subvars (TREE_TYPE (v));
if (TREE_CODE (TREE_TYPE (v)) == RECORD_TYPE)
return true;
return false;
} }
/* Return true if T is a type that does contain pointers. */ /* Return true if T is a type that does contain pointers. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment