From 6aa2e42cb4be16ee0937ba872b297b11d8f0a18b Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Wed, 3 Jul 2019 10:32:25 +0200 Subject: [PATCH] Handle '\0' in strcmp in RTL expansion (PR tree-optimization/90892). 2019-07-03 Martin Liska PR tree-optimization/90892 * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' in string constants. 2019-07-03 Martin Liska PR tree-optimization/90892 * gcc.dg/pr90892.c: New test. From-SVN: r272993 --- gcc/ChangeLog | 6 ++++++ gcc/builtins.c | 17 ++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr90892.c | 14 ++++++++++++++ 4 files changed, 39 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr90892.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2f69905f76..a1d7c5bedd7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2019-07-03 Martin Liska + + PR tree-optimization/90892 + * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' + in string constants. + 2019-07-03 Martin Liska PR middle-end/90899 diff --git a/gcc/builtins.c b/gcc/builtins.c index 2b8914f13ee..e2ba356c0d3 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7118,8 +7118,19 @@ inline_expand_builtin_string_cmp (tree exp, rtx target) return NULL_RTX; /* For strncmp, if the length is not a const, not qualify. */ - if (is_ncmp && !tree_fits_uhwi_p (len3_tree)) - return NULL_RTX; + if (is_ncmp) + { + if (!tree_fits_uhwi_p (len3_tree)) + return NULL_RTX; + else + len3 = tree_to_uhwi (len3_tree); + } + + if (src_str1 != NULL) + len1 = strnlen (src_str1, len1) + 1; + + if (src_str2 != NULL) + len2 = strnlen (src_str2, len2) + 1; int const_str_n = 0; if (!len1) @@ -7134,7 +7145,7 @@ inline_expand_builtin_string_cmp (tree exp, rtx target) gcc_checking_assert (const_str_n > 0); length = (const_str_n == 1) ? len1 : len2; - if (is_ncmp && (len3 = tree_to_uhwi (len3_tree)) < length) + if (is_ncmp && len3 < length) length = len3; /* If the length of the comparision is larger than the threshold, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 512e86cf2cb..d5521123230 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-07-03 Martin Liska + + PR tree-optimization/90892 + * gcc.dg/pr90892.c: New test. + 2019-07-03 Martin Liska PR middle-end/90899 diff --git a/gcc/testsuite/gcc.dg/pr90892.c b/gcc/testsuite/gcc.dg/pr90892.c new file mode 100644 index 00000000000..e4b5310807a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr90892.c @@ -0,0 +1,14 @@ +/* PR tree-optimization/90892 */ +/* { dg-do run } */ +/* { dg-options "-O2" } */ + +const char *a = "A\0b"; + +int +main() +{ + if (__builtin_strncmp(a, "A\0", 2) != 0) + __builtin_abort (); + + return 0; +} -- 2.30.2