Bug 50262

Summary: PTA doesn't disambiguate locally allocated heap objects from pointed to by arguments
Product: gcc Reporter: Jakub Jelinek <jakub>
Component: middle-endAssignee: Richard Biener <rguenth>
Status: RESOLVED FIXED    
Severity: normal CC: rguenth
Priority: P3 Keywords: alias, missed-optimization
Version: 4.7.0   
Target Milestone: 4.9.0   
Host: Target:
Build: Known to work:
Known to fail: Last reconfirmed: 2011-09-01 00:00:00

Description Jakub Jelinek 2011-09-01 09:58:06 UTC
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;
}
Comment 1 Richard Biener 2011-09-01 11:10:21 UTC
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.
Comment 2 Richard Biener 2011-09-29 12:35:32 UTC
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.
Comment 3 Richard Biener 2013-11-15 10:59:01 UTC
I finally have a patch ...
Comment 4 Richard Biener 2013-11-15 14:48:24 UTC
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
Comment 5 Richard Biener 2013-11-15 14:49:16 UTC
Fixed on trunk.