Commit 2fd30fbe by Richard Biener Committed by Richard Biener

re PR tree-optimization/79547 (duplicate strlen calls with same argument not folded)

2017-04-21  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/79547
	* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
	Handle strlen, strcmp, strncmp, strcasecmp, strncasecmp, memcmp,
	bcmp, strspn, strcspn, __builtin_object_size and __builtin_constant_p
	without any constraints.

	* gcc.dg/tree-ssa/strlen-2.c: New testcase.

From-SVN: r247062
parent bb1bc604
2017-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/79547
* tree-ssa-structalias.c (find_func_aliases_for_builtin_call):
Handle strlen, strcmp, strncmp, strcasecmp, strncasecmp, memcmp,
bcmp, strspn, strcspn, __builtin_object_size and __builtin_constant_p
without any constraints.
2017-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/78847
* fold-const.c (split_tree): Handle POINTER_PLUS_EXPR.
......
2017-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/79547
* gcc.dg/tree-ssa/strlen-2.c: New testcase.
2017-04-21 Richard Biener <rguenther@suse.de>
PR tree-optimization/78847
* g++.dg/tree-ssa/pr78847.C: New testcase.
......
/* { dg-do compile } */
/* { dg-options "-O2 -fdump-tree-strlen" } */
void f (unsigned);
void f3 (void)
{
char s[] = "1234";
f (__builtin_strlen (s));
f (__builtin_strlen (s));
f (__builtin_strlen (s));
}
/* { dg-final { scan-tree-dump-times "strlen" 0 "strlen" } } */
......@@ -4474,6 +4474,40 @@ find_func_aliases_for_builtin_call (struct function *fn, gcall *t)
process_all_all_constraints (lhsc, rhsc);
}
return true;
/* Pure functions that return something not based on any object and
that use the memory pointed to by their arguments (but not
transitively). */
case BUILT_IN_STRCMP:
case BUILT_IN_STRNCMP:
case BUILT_IN_STRCASECMP:
case BUILT_IN_STRNCASECMP:
case BUILT_IN_MEMCMP:
case BUILT_IN_BCMP:
case BUILT_IN_STRSPN:
case BUILT_IN_STRCSPN:
{
varinfo_t uses = get_call_use_vi (t);
make_any_offset_constraints (uses);
make_constraint_to (uses->id, gimple_call_arg (t, 0));
make_constraint_to (uses->id, gimple_call_arg (t, 1));
/* No constraints are necessary for the return value. */
return true;
}
case BUILT_IN_STRLEN:
{
varinfo_t uses = get_call_use_vi (t);
make_any_offset_constraints (uses);
make_constraint_to (uses->id, gimple_call_arg (t, 0));
/* No constraints are necessary for the return value. */
return true;
}
case BUILT_IN_OBJECT_SIZE:
case BUILT_IN_CONSTANT_P:
{
/* No constraints are necessary for the return value or the
arguments. */
return true;
}
/* Trampolines are special - they set up passing the static
frame. */
case BUILT_IN_INIT_TRAMPOLINE:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment