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

Reply via email to