From caed5c92712701509413c579fb004faa965e4004 Mon Sep 17 00:00:00 2001 From: Qing Zhao Date: Fri, 17 Nov 2017 05:32:05 +0000 Subject: [PATCH] re PR middle-end/78809 (Inline strcmp with small constant strings) 2017-11-15 Qing Zhao 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 --- gcc/ChangeLog | 7 +++++++ gcc/gimple-fold.c | 15 +++++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/strcmpopt_1.c | 28 ++++++++++++++++++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/strcmpopt_1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index da8a9cea33b..9352b48ccf3 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2017-11-15 Qing Zhao + + 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 * config/i386/x86-tune.def (X86_TUNE_AVX256_OPTIMAL): Add tuning diff --git a/gcc/gimple-fold.c b/gcc/gimple-fold.c index adb6f3baf93..1ed63833b73 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 f9221894efd..d597fe606cc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-11-15 Qing Zhao > + + PR middle-end/78809 + * gcc.dg/strcmpopt_1.c: New test. + 2017-11-16 Joseph Myers * 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 00000000000..40596a20b40 --- /dev/null +++ b/gcc/testsuite/gcc.dg/strcmpopt_1.c @@ -0,0 +1,28 @@ +/* { dg-do run } */ +/* { dg-options "-fdump-tree-gimple" } */ + +#include +#include + +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" } } */