aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-ssa-structalias.c
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2012-09-07 10:27:02 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2012-09-07 10:27:02 +0000
commit81ab73121e775ca961650a7eb4656b5075a492c5 (patch)
tree441fe35fe49b5f9c8bf0147e5c38e577a542eeaf /gcc/tree-ssa-structalias.c
parentd630245f9d4584bd3ecb2192f8e2ba05e1db77ba (diff)
downloadgcc-81ab73121e775ca961650a7eb4656b5075a492c5.zip
gcc-81ab73121e775ca961650a7eb4656b5075a492c5.tar.gz
gcc-81ab73121e775ca961650a7eb4656b5075a492c5.tar.bz2
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: r191064
Diffstat (limited to 'gcc/tree-ssa-structalias.c')
-rw-r--r--gcc/tree-ssa-structalias.c36
1 files changed, 25 insertions, 11 deletions
diff --git a/gcc/tree-ssa-structalias.c b/gcc/tree-ssa-structalias.c
index efe0698..4969edc 100644
--- a/gcc/tree-ssa-structalias.c
+++ b/gcc/tree-ssa-structalias.c
@@ -3743,29 +3743,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