char *r; char foo (char *p, int len) { char *q = __builtin_malloc (len); *p = 1; *q = 2; r = q; return *p; } doesn't optimize return *p; into return 1; even when *q store can't alias *p. This matters e.g. for the string length optimization I'm working on. Testcase for the latter is e.g.: #include <string.h> #include <stdlib.h> char * foo (char *p, char *r) { char *q = malloc (strlen (p) + strlen (r) + 64); if (q == NULL) return NULL; strcpy (q, p); strcat (q, "/"); strcat (q, "abcde"); strcat (q, r); strcat (q, "/"); return q; }
Mine. I have some partial patches somewhere and at least an idea how to start to disentangle the mess that causes us to give up here.
Not disambiguated because the HEAP tag of q escapes and thus the points-to set of q has vars_contains_global set, which then aliases with p which just has nonlocal set. We'd probably need a vars_contains_nonlocal and vars_contains_escaped to distinguish the flow-sensitivity of nonlocal vs. escaped also in the generated points-to info.
I finally have a patch ...
Author: rguenth Date: Fri Nov 15 14:48:22 2013 New Revision: 204845 URL: http://gcc.gnu.org/viewcvs?rev=204845&root=gcc&view=rev Log: 2013-11-15 Richard Biener <rguenther@suse.de> PR tree-optimization/50262 * tree-ssa-alias.h (struct pt_solution): Split vars_contains_global into vars_contains_nonlocal, vars_contains_escaped and vars_contains_escaped_heap. * tree-ssa-structalias.c (label_visit): Expand comment. (handle_lhs_call): Adjust comment. (set_uids_in_ptset): Set the new flags appropriately. (pt_solution_set): Adjust. (pt_solution_set_var): Likewise. (pt_solution_ior_into): Likewise. (pt_solution_includes_global): Likewise. (pt_solutions_intersect_1): Optimize escaped handling. (compute_points_to_sets): Remove heap variable globalization. (ipa_escaped_pt): Adjust initializer. (pass_data_ipa_pta): Do not run TODO_update_ssa. * gimple-pretty-print.c (pp_points_to_solution): Print split flags. * tree-ssa-alias.c (dump_points_to_solution): Likewise. * gcc.dg/tree-ssa/alias-28.c: New testcase. * gcc.dg/strlenopt-1.c: Adjust. * gcc.dg/strlenopt-1f.c: Likewise. Added: trunk/gcc/testsuite/gcc.dg/tree-ssa/alias-28.c Modified: trunk/gcc/ChangeLog trunk/gcc/gimple-pretty-print.c trunk/gcc/testsuite/ChangeLog trunk/gcc/testsuite/gcc.dg/strlenopt-1.c trunk/gcc/testsuite/gcc.dg/strlenopt-1f.c trunk/gcc/tree-ssa-alias.c trunk/gcc/tree-ssa-alias.h trunk/gcc/tree-ssa-structalias.c
Fixed on trunk.