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
This commit is contained in:
Qing Zhao 2017-11-17 05:32:05 +00:00 committed by Jeff Law
parent 5958557b75
commit caed5c9271
4 changed files with 55 additions and 0 deletions

View File

@ -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

View File

@ -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;
}

View File

@ -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.

View File

@ -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" } } */