On 6/18/19 12:16 PM, Jakub Jelinek wrote: > I think any such length changes should be moved after the two punt checks. > Move also the len3 setting before the new checks (of course conditional on > is_ncmp).
Ok, I'm sending updated version of the patch that addresses this. I've been testing the patch. Ready to be installed then? Thanks, Martin
>From 35043ab431c0dc1e8dcda484725a1f8875a4b95b Mon Sep 17 00:00:00 2001 From: Martin Liska <mli...@suse.cz> Date: Mon, 17 Jun 2019 10:39:15 +0200 Subject: [PATCH] Handle '\0' in strcmp in RTL expansion (PR tree-optimization/90892). gcc/ChangeLog: 2019-06-17 Martin Liska <mli...@suse.cz> PR tree-optimization/90892 * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' in string constants. gcc/testsuite/ChangeLog: 2019-06-17 Martin Liska <mli...@suse.cz> PR tree-optimization/90892 * gcc.dg/pr90892.c: New test. --- gcc/builtins.c | 17 ++++++++++++++--- gcc/testsuite/gcc.dg/pr90892.c | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr90892.c diff --git a/gcc/builtins.c b/gcc/builtins.c index c53afe8b033..db7939cfde8 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/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.21.0