]> git.ipfire.org Git - thirdparty/gcc.git/commit
2nd Patch for PR78009
authorqinzhao <qinzhao@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 May 2018 20:01:42 +0000 (20:01 +0000)
committerqinzhao <qinzhao@138bc75d-0d04-0410-961f-82ee72b054a4>
Thu, 31 May 2018 20:01:42 +0000 (20:01 +0000)
commit72dbc21dbbdd08cd4047d68bce3154dc485a4255
tree1788b6670d6db9169fdfad6b15c80815fe4af24d
parent4631030377a410cf11ef94bc15619a0bfe91ebab
2nd Patch for PR78009
Patch for PR83026

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78809
Inline strcmp with small constant strings

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=83026
missing strlen optimization for strcmp of unequal strings

The design doc for PR78809 is at:
https://www.mail-archive.com/gcc@gcc.gnu.org/msg83822.html

this patch is for the second part of change of PR78809 and PR83026:

B. for strncmp (s1, s2, n) (!)= 0 or strcmp (s1, s2) (!)= 0

   B.1. (PR83026) When the lengths of both arguments are constant and
        it's a strcmp:
      * if the lengths are NOT equal, we can safely fold the call
        to a non-zero value.
      * otherwise, do nothing now.

   B.2. (PR78809) When the length of one argument is constant, try to replace
   the call with a __builtin_str(n)cmp_eq call where possible, i.e:

   strncmp (s, STR, C) (!)= 0 in which, s is a pointer to a string, STR is a
   string with constant length, C is a constant.
     if (C <= strlen(STR) && sizeof_array(s) > C)
       {
         replace this call with
         __builtin_strncmp_eq (s, STR, C) (!)= 0
       }
     if (C > strlen(STR)
       {
         it can be safely treated as a call to strcmp (s, STR) (!)= 0
         can handled by the following strcmp.
       }

   strcmp (s, STR) (!)= 0 in which, s is a pointer to a string, STR is a
   string with constant length.
     if  (sizeof_array(s) > strlen(STR))
       {
         replace this call with
         __builtin_strcmp_eq (s, STR, strlen(STR)+1) (!)= 0
       }

   later when expanding the new __builtin_str(n)cmp_eq calls, first expand them
   as __builtin_memcmp_eq, if the expansion does not succeed, change them back
   to call to __builtin_str(n)cmp.

adding test case strcmpopt_2.c and strcmpopt_4.c into gcc.dg for part B of
PR78809 adding test case strcmpopt_3.c into gcc.dg for PR83026

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@261039 138bc75d-0d04-0410-961f-82ee72b054a4
gcc/ChangeLog
gcc/builtins.c
gcc/builtins.def
gcc/gimple-fold.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/strcmpopt_2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/strcmpopt_3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/strcmpopt_4.c [new file with mode: 0644]
gcc/tree-ssa-strlen.c
gcc/tree-ssa-structalias.c
gcc/tree.c