On 6/14/19 2:03 PM, Jeff Law wrote:
On 6/13/19 5:50 PM, Martin Sebor wrote:
While integrating the strlen and sprintf passes and investigating
optimization opportunities that it opens up I noticed a few related
to a strcmp optimization implemented in GCC 9. One is to take
advantage of the fact that a nul-terminated string of a known
length cannot be equal to a string whose length is greater, even
if it isn't known exactly. For example, the equality below must
be false:
int f (char * restrict a, char * restrict b)
{
memcpy (a, "1234", 4); // length >= 4
strcpy (b, "123"); // length == 3
return strcmp (a, b) == 0; // must be false
}
The attached patch enhances the existing optimization to exploit
this opportunity.
Tested on x86_64-linux.
Martin
PS There are several more improvements to be made here. I've been
raising bugs for them and I plan to submit patches for them in
the near future. (Incidentally, they are all in the spirit of
the suggestion made back in 2012 in pr52171.)
gcc-90626.diff
PR tree-optimization/90626 - fold strcmp(a, b) == 0 to zero when one string
length is exact and the other is unequal
gcc/ChangeLog:
PR tree-optimization/90626
* tree-ssa-strlen.c (strxcmp_unequal): New function.
(handle_builtin_string_cmp): Call it.
gcc/testsuite/ChangeLog:
PR tree-optimization/90626
* gcc.dg/strlenopt-65.c: New test.
* gcc.dg/strlenopt-66.c: New test.
* gcc.dg/strlenopt.h (strcmp, strncmp): Declare.
OK. Good to see we're able to extend Qing's work to handle more cases
without major surgery.
I had a couple of typos in there that I had overlooked along
with a test failure they caused. I fixed those in the followup
r272487. Sorry about that.
Martin