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?