https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83702
Bug ID: 83702 Summary: missing strlen range optimization for calls with an offset 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: --- Testing an unrelated strlen optimization enhancement exposed another limitation in the folding of strlen expressions. GCC 8 is able to optimize code based on the knowledge that the length of a string is bounded by the size of the array it is stored in. But it can only do that for strlen calls with no offset, or for strlen calls with strings of known length and a constant offset. Calls that involve an offset into an array are not folded, irrespective of whether the offset is constant. Similarly, calls that involve strings of known length and a non-const offset aren't folded. Both sets of cases could be folded. $ cat x.c && gcc -O2 -S -Wall -fdump-tree-optimized=/dev/stdout x.c | grep -e "^f[0-9]" -e abort -estrlen #define S "1234567" char a[8] = S; char a[8]; void f0 (void) { if (__builtin_strlen (a) > 7) // folded __builtin_abort (); } void f1 (void) { if (__builtin_strlen (S + 1) > 6) // folded __builtin_abort (); } void f2 (void) { if (__builtin_strlen (a + 1) > 6) // not folded but could be __builtin_abort (); } void f3 (int i) { if (__builtin_strlen (S + i) > 7) // not folded but could be __builtin_abort (); } void f4 (int i) { if (__builtin_strlen (a + i) > 7) // not folded but could be __builtin_abort (); } f0 () f1 () f2 () _1 = __builtin_strlen (&MEM[(void *)&a + 1B]); __builtin_abort (); f3 (int i) __builtin_abort (); f4 (int i) _3 = __builtin_strlen (_2); __builtin_abort ();