re PR middle-end/53667 (Cray pointer: Wrong result with optimizations)

2012-09-07  Richard Guenther  <rguenther@suse.de>

	PR middle-end/53667
	* tree-ssa-structalias.c (handle_rhs_call): Properly clobber
	EAF_NOESCAPED arguments.  Transitively close non-EAF_DIRECT
	arguments separately.

From-SVN: r191065
This commit is contained in:
Richard Guenther 2012-09-07 10:29:56 +00:00 committed by Richard Biener
parent f3a2c346ce
commit 33069fa92f
2 changed files with 32 additions and 11 deletions

View File

@ -1,3 +1,10 @@
2012-09-07 Richard Guenther <rguenther@suse.de>
PR middle-end/53667
* tree-ssa-structalias.c (handle_rhs_call): Properly clobber
EAF_NOESCAPED arguments. Transitively close non-EAF_DIRECT
arguments separately.
2012-09-07 Jakub Jelinek <jakub@redhat.com>
Backported from mainline

View File

@ -3735,29 +3735,43 @@ handle_rhs_call (gimple stmt, VEC(ce_s, heap) **results)
/* As we compute ESCAPED context-insensitive we do not gain
any precision with just EAF_NOCLOBBER but not EAF_NOESCAPE
set. The argument would still get clobbered through the
escape solution.
??? We might get away with less (and more precise) constraints
if using a temporary for transitively closing things. */
escape solution. */
if ((flags & EAF_NOCLOBBER)
&& (flags & EAF_NOESCAPE))
{
varinfo_t uses = get_call_use_vi (stmt);
if (!(flags & EAF_DIRECT))
make_transitive_closure_constraints (uses);
make_constraint_to (uses->id, arg);
{
varinfo_t tem = new_var_info (NULL_TREE, "callarg");
make_constraint_to (tem->id, arg);
make_transitive_closure_constraints (tem);
make_copy_constraint (uses, tem->id);
}
else
make_constraint_to (uses->id, arg);
returns_uses = true;
}
else if (flags & EAF_NOESCAPE)
{
struct constraint_expr lhs, rhs;
varinfo_t uses = get_call_use_vi (stmt);
varinfo_t clobbers = get_call_clobber_vi (stmt);
varinfo_t tem = new_var_info (NULL_TREE, "callarg");
make_constraint_to (tem->id, arg);
if (!(flags & EAF_DIRECT))
{
make_transitive_closure_constraints (uses);
make_transitive_closure_constraints (clobbers);
}
make_constraint_to (uses->id, arg);
make_constraint_to (clobbers->id, arg);
make_transitive_closure_constraints (tem);
make_copy_constraint (uses, tem->id);
make_copy_constraint (clobbers, tem->id);
/* Add *tem = nonlocal, do not add *tem = callused as
EAF_NOESCAPE parameters do not escape to other parameters
and all other uses appear in NONLOCAL as well. */
lhs.type = DEREF;
lhs.var = tem->id;
lhs.offset = 0;
rhs.type = SCALAR;
rhs.var = nonlocal_id;
rhs.offset = 0;
process_constraint (new_constraint (lhs, rhs));
returns_uses = true;
}
else