Commit 6a66f28e by Richard Guenther Committed by Richard Biener

re PR tree-optimization/39358 (Wrong aliasing warning with lists)

2009-03-04  Richard Guenther  <rguenther@suse.de>

	PR tree-optimization/39358
	* tree-ssa-structalias.c (do_sd_constraint): Fix check for
	escaped_id and callused_id.
	(solve_graph): Likewise.

	* g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C: New testcase.
	* g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C: Likewise.

From-SVN: r144602
parent c0de2907
2009-03-04 Richard Guenther <rguenther@suse.de> 2009-03-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39358
* tree-ssa-structalias.c (do_sd_constraint): Fix check for
escaped_id and callused_id.
(solve_graph): Likewise.
2009-03-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39339 PR tree-optimization/39339
* tree-sra.c (try_instantiate_multiple_fields): Make it * tree-sra.c (try_instantiate_multiple_fields): Make it
no longer ICE on the above. no longer ICE on the above.
......
2009-03-04 Richard Guenther <rguenther@suse.de> 2009-03-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39358
* g++.dg/warn/Wstrict-aliasing-bogus-escape-2.C: New testcase.
* g++.dg/warn/Wstrict-aliasing-bogus-escape-3.C: Likewise.
2009-03-04 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39339 PR tree-optimization/39339
* gcc.c-torture/execute/pr39339.c: New testcase. * gcc.c-torture/execute/pr39339.c: New testcase.
......
/* { dg-do compile } */
/* { dg-options "-O2 -Wstrict-aliasing" } */
#include<list>
struct A
{
virtual ~A();
};
A* foo();
void bar(std::list<int> x)
{
std::list<int> y = x;
if (*y.rbegin())
delete foo();
}
/* { dg-do compile } */
/* { dg-options "-O2 -Wstrict-aliasing" } */
struct Node_base {};
struct Node : Node_base
{
int data;
};
struct List
{
Node_base node, *prev;
List() : prev(&node) { xyz(); }
void xyz();
int back() { return static_cast<Node*>(prev)->data; }
};
struct A
{
virtual ~A();
};
A* foo();
void bar()
{
List y;
if (y.back())
delete foo();
}
...@@ -1524,8 +1524,8 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c, ...@@ -1524,8 +1524,8 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
of a variable can also reach all other fields of the variable of a variable can also reach all other fields of the variable
we simply have to expand the solution to contain all sub-fields we simply have to expand the solution to contain all sub-fields
if one sub-field is contained. */ if one sub-field is contained. */
if (c->rhs.var == escaped_id if (c->rhs.var == find (escaped_id)
|| c->rhs.var == callused_id) || c->rhs.var == find (callused_id))
{ {
bitmap vars = NULL; bitmap vars = NULL;
/* In a first pass record all variables we need to add all /* In a first pass record all variables we need to add all
...@@ -1594,9 +1594,10 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c, ...@@ -1594,9 +1594,10 @@ do_sd_constraint (constraint_graph_t graph, constraint_t c,
/* Merging the solution from ESCAPED needlessly increases /* Merging the solution from ESCAPED needlessly increases
the set. Use ESCAPED as representative instead. the set. Use ESCAPED as representative instead.
Same for CALLUSED. */ Same for CALLUSED. */
else if (get_varinfo (t)->id == escaped_id else if (get_varinfo (t)->id == find (escaped_id))
|| get_varinfo (t)->id == callused_id) flag |= bitmap_set_bit (sol, escaped_id);
flag |= bitmap_set_bit (sol, get_varinfo (t)->id); else if (get_varinfo (t)->id == find (callused_id))
flag |= bitmap_set_bit (sol, callused_id);
else if (add_graph_edge (graph, lhs, t)) else if (add_graph_edge (graph, lhs, t))
flag |= bitmap_ior_into (sol, get_varinfo (t)->solution); flag |= bitmap_ior_into (sol, get_varinfo (t)->solution);
} }
...@@ -2516,8 +2517,8 @@ solve_graph (constraint_graph_t graph) ...@@ -2516,8 +2517,8 @@ solve_graph (constraint_graph_t graph)
if (!solution_empty if (!solution_empty
/* Do not propagate the ESCAPED/CALLUSED solutions. */ /* Do not propagate the ESCAPED/CALLUSED solutions. */
&& i != escaped_id && i != find (escaped_id)
&& i != callused_id) && i != find (callused_id))
{ {
bitmap_iterator bi; bitmap_iterator bi;
......
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