https://gcc.gnu.org/bugzilla/show_bug.cgi?id=84577
Bug ID: 84577 Summary: snprintf with null buffer not eliminated when return value is in a known range Product: gcc Version: 8.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: --- The sprintf pass eliminates snprintf calls with a null buffer and zero size when whose return value is a constant but it does not eliminate calls whose return value is in some range. Both calls can be eliminated. $ cat b.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout b.c void f (void) { int n = __builtin_snprintf (0, 0, "%hhx", 123); // eliminated if (n < 0 || 2 < n) __builtin_abort (); } void g (int i) { int n = __builtin_snprintf (0, 0, "%hhx", i); // not eliminated but could be if (n < 0 || 2 < n) __builtin_abort (); } ;; Function f (f, funcdef_no=0, decl_uid=1957, cgraph_uid=0, symbol_order=0) f () { <bb 2> [local count: 1073741825]: return; } ;; Function g (g, funcdef_no=1, decl_uid=1961, cgraph_uid=1, symbol_order=1) g (int i) { <bb 2> [local count: 1073741825]: __builtin_snprintf (0B, 0, "%hhx", i_3(D)); [tail call] return; }