[PATCH] improve strcmp folding of unequal strings (PR 90626)

Martin Sebor msebor@gmail.com
Wed Jun 19 21:51:00 GMT 2019


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



More information about the Gcc-patches mailing list