https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78476
Bug ID: 78476
Summary: snprintf(0, 0, ...) with known arguments not optimized
away
Product: gcc
Version: 7.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
As a special case, a call to snprintf with a zero size is a request to compute
the size of output without actually writing anything into the provided buffer
(which may be a null pointer). When the format string and all arguments to all
directives in it are within known ranges such that the output length can be
determined at compile time (by the -fprintf-return-value optimization) the
entire snprintf call can be eliminated and replaced with the constant return
value. The test case below shows that while GCC folds the return value it does
not take advantage of this additional optimization opportunity.
$ cat c.c && /build/gcc-svn/gcc/xgcc -B /build/gcc-svn/gcc -O2 -c
-fdump-tree-optimized=/dev/stdout c.c
void f (const char *s)
{
int n = 7;
if (n != __builtin_snprintf (0, 0, "%.*s", n, s))
__builtin_abort ();
}
;; Function f (f, funcdef_no=0, decl_uid=1795, cgraph_uid=0, symbol_order=0)
f (const char * s)
{
<bb 2>:
__builtin_snprintf (0B, 0, "%.*s", 7, s_3(D)); [tail call]
return;
}