diff options
author | Qing Zhao <qing.zhao@oracle.com> | 2017-11-17 05:32:05 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 2017-11-16 22:32:05 -0700 |
commit | caed5c92712701509413c579fb004faa965e4004 (patch) | |
tree | e6a25de7a4c912e87fdd28ec9a45b3cfc6aa2388 /gcc | |
parent | 5958557b750254f28954d1ed6a3ce0b9cb48c6fb (diff) | |
download | gcc-caed5c92712701509413c579fb004faa965e4004.zip gcc-caed5c92712701509413c579fb004faa965e4004.tar.gz gcc-caed5c92712701509413c579fb004faa965e4004.tar.bz2 |
re PR middle-end/78809 (Inline strcmp with small constant strings)
2017-11-15 Qing Zhao <qing.zhao@oracle.com>
PR middle-end/78809
* gimple-fold.c (gimple_fold_builtin_string_compare): Add handling
of replacing call to strncmp with corresponding call to strcmp when
meeting conditions.
PR middle-end/78809
* gcc.dg/strcmpopt_1.c: New test.
From-SVN: r254856
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gimple-fold.c | 15 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/strcmpopt_1.c | 28 |
4 files changed, 55 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da8a9ce..9352b48 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-11-15 Qing Zhao <qing.zhao@oracle.com> + + PR middle-end/78809 + * gimple-fold.c (gimple_fold_builtin_string_compare): Add handling + of replacing call to strncmp with corresponding call to strcmp when + meeting conditions. + 2017-11-17 Sergey Shalnov <Sergey.Shalnov@intel.com> * config/i386/x86-tune.def (X86_TUNE_AVX256_OPTIMAL): Add tuning diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index adb6f3b..1ed6383 100644 --- a/gcc/gimple-fold.c +++ b/gcc/gimple-fold.c @@ -2258,6 +2258,21 @@ gimple_fold_builtin_string_compare (gimple_stmt_iterator *gsi) return true; } + /* If length is larger than the length of one constant string, + replace strncmp with corresponding strcmp */ + if (fcode == BUILT_IN_STRNCMP + && length > 0 + && ((p2 && (size_t) length > strlen (p2)) + || (p1 && (size_t) length > strlen (p1)))) + { + tree fn = builtin_decl_implicit (BUILT_IN_STRCMP); + if (!fn) + return false; + gimple *repl = gimple_build_call (fn, 2, str1, str2); + replace_call_with_call_and_fold (gsi, repl); + return true; + } + return false; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f922189..d597fe6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-15 Qing Zhao <qing.zhao@oracle.com <mailto:qing.zhao@oracle.com>> + + PR middle-end/78809 + * gcc.dg/strcmpopt_1.c: New test. + 2017-11-16 Joseph Myers <joseph@codesourcery.com> * gcc.dg/c18-version-1.c, gcc.dg/c18-version-2.c: New tests. diff --git a/gcc/testsuite/gcc.dg/strcmpopt_1.c b/gcc/testsuite/gcc.dg/strcmpopt_1.c new file mode 100644 index 0000000..40596a2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/strcmpopt_1.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-options "-fdump-tree-gimple" } */ + +#include <string.h> +#include <stdlib.h> + +int cmp1 (char *p) +{ + return strncmp (p, "fis", 4); +} +int cmp2 (char *q) +{ + return strncmp ("fis", q, 4); +} + +int main () +{ + + char *p = "fish"; + char *q = "fis\0"; + + if (cmp1 (p) == 0 || cmp2 (q) != 0) + abort (); + + return 0; +} + +/* { dg-final { scan-tree-dump-times "strcmp \\(" 2 "gimple" } } */ |