https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91315
Bug ID: 91315 Summary: missing strlen lower bound of a string known to be at least N characters Product: gcc Version: 9.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: --- In the program below the strlen pass tracks the (minimum) length of the string formed by each of the functions, yet it doesn't expose that information to downstream passes that could fold each of the tests to false on that basis. $ cat z.c && gcc -O2 -Wall -S -fdump-tree-optimized=/dev/stdout z.c char a[8]; void f0 (void) { a[0] = '1'; a[1] = '2'; if (__builtin_strlen (a) < 2) __builtin_abort (); } void f1 (void) { __builtin_memcpy (a, "123", 3); if (__builtin_strlen (a) < 3) __builtin_abort (); } void f2 (void) { *__builtin_stpcpy (a, "123") = '4'; if (__builtin_strlen (a) < 4) __builtin_abort (); } ;; Function f0 (f0, funcdef_no=0, decl_uid=1909, cgraph_uid=1, symbol_order=1) f0 () { long unsigned int _1; <bb 2> [local count: 1073741824]: MEM <unsigned short> [(char *)&a] = 12849; _1 = __builtin_strlen (&a); if (_1 <= 1) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] <bb 3> [count: 0]: __builtin_abort (); <bb 4> [local count: 1073741824]: return; } ;; Function f1 (f1, funcdef_no=1, decl_uid=1912, cgraph_uid=2, symbol_order=2) f1 () { long unsigned int _1; <bb 2> [local count: 1073741824]: __builtin_memcpy (&a, "123", 3); _1 = __builtin_strlen (&a); if (_1 <= 2) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] <bb 3> [count: 0]: __builtin_abort (); <bb 4> [local count: 1073741824]: return; } ;; Function f2 (f2, funcdef_no=2, decl_uid=1915, cgraph_uid=3, symbol_order=3) f2 () { long unsigned int _1; <bb 2> [local count: 1073741824]: __builtin_memcpy (&a, "123", 3); MEM[(char *)&a + 3B] = 52; _1 = __builtin_strlen (&a); if (_1 <= 3) goto <bb 3>; [0.00%] else goto <bb 4>; [100.00%] <bb 3> [count: 0]: __builtin_abort (); <bb 4> [local count: 1073741824]: return; }