[Bug tree-optimization/79547] duplicate strlen calls with same argument not folded
rguenth at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Feb 16 11:19:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79547
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Status|UNCONFIRMED |ASSIGNED
Last reconfirmed| |2017-02-16
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot gnu.org
Ever confirmed|0 |1
--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
Yes, the issue is that we are not told that __builtin_strlen does not return
something that can be used to re-construct the address of 's' and thus
passing that return value to f() makes it escaped. That is, strlen is not
size_t strlen(const char *s) { return (size_t)s; }
handling strlen inside find_func_aliases_for_builtin_call would fix that part
but for example SCCVN doesn't do stmt walking when CSEing pure calls. But the
strlen pass then handles things.
Index: gcc/tree-ssa-structalias.c
===================================================================
--- gcc/tree-ssa-structalias.c (revision 245501)
+++ gcc/tree-ssa-structalias.c (working copy)
@@ -4474,6 +4474,12 @@ find_func_aliases_for_builtin_call (stru
process_all_all_constraints (lhsc, rhsc);
}
return true;
+ /* Pure functions that return something not based on any object. */
+ case BUILT_IN_STRLEN:
+ /* We don't need to do anything here. No constraints are necessary
+ for the return value and call handling for pure functions is
+ special-cased in the alias oracle. */
+ return true;
/* Trampolines are special - they set up passing the static
frame. */
case BUILT_IN_INIT_TRAMPOLINE:
any other similar (pure/const) builtins?
More information about the Gcc-bugs
mailing list