From: Richard Guenther Date: Fri, 7 Sep 2012 10:27:02 +0000 (+0000) Subject: re PR middle-end/53667 (Cray pointer: Wrong result with optimizations) X-Git-Tag: upstream/12.2.0~74390 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=81ab73121e775ca961650a7eb4656b5075a492c5;p=platform%2Fupstream%2Fgcc.git re PR middle-end/53667 (Cray pointer: Wrong result with optimizations) 2012-09-07 Richard Guenther 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index b645604..cdf6a20 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2012-09-07 Richard Guenther + + 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 Steven Bosscher * bitmap.c (bitmap_last_set_bit): Rewrite to return the correct bit. 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