From: Martin Liska Date: Thu, 4 Jul 2019 09:03:56 +0000 (+0200) Subject: Backport r272993 X-Git-Tag: releases/gcc-9.2.0~170 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b098c7983c12e17ba872d2241173c186a3c6f4e9;p=thirdparty%2Fgcc.git Backport r272993 2019-07-04 Martin Liska Backport from mainline 2019-07-03 Martin Liska PR tree-optimization/90892 * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' in string constants. 2019-07-04 Martin Liska Backport from mainline 2019-07-03 Martin Liska PR tree-optimization/90892 * gcc.dg/pr90892.c: New test. From-SVN: r273074 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ae633153aa8f..82010817b6ae 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2019-07-04 Martin Liska + + Backport from mainline + 2019-07-03 Martin Liska + + PR tree-optimization/90892 + * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' + in string constants. + 2019-07-04 Martin Liska Backport from mainline diff --git a/gcc/builtins.c b/gcc/builtins.c index d37d73fc4a0f..9bcb310c0150 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7124,8 +7124,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) @@ -7140,7 +7151,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 2a42f3c15b06..07b2fa79dbf5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2019-07-04 Martin Liska + + Backport from mainline + 2019-07-03 Martin Liska + + PR tree-optimization/90892 + * gcc.dg/pr90892.c: New test. + 2019-07-04 Martin Liska Backport from mainline diff --git a/gcc/testsuite/gcc.dg/pr90892.c b/gcc/testsuite/gcc.dg/pr90892.c new file mode 100644 index 000000000000..e4b5310807aa --- /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; +}