diff options
author | Martin Liska <mliska@suse.cz> | 2019-07-03 10:32:25 +0200 |
---|---|---|
committer | Martin Liska <marxin@gcc.gnu.org> | 2019-07-03 08:32:25 +0000 |
commit | 6aa2e42cb4be16ee0937ba872b297b11d8f0a18b (patch) | |
tree | f210a49163af5fc3a3d03f5a1cff2bf92bf3d423 | |
parent | d04295d24364b0138c354e249a4bb14e0a6ffb96 (diff) | |
download | gcc-6aa2e42cb4be16ee0937ba872b297b11d8f0a18b.tar.gz |
Handle '\0' in strcmp in RTL expansion (PR tree-optimization/90892).
2019-07-03 Martin Liska <mliska@suse.cz>
PR tree-optimization/90892
* builtins.c (inline_expand_builtin_string_cmp): Handle '\0'
in string constants.
2019-07-03 Martin Liska <mliska@suse.cz>
PR tree-optimization/90892
* gcc.dg/pr90892.c: New test.
From-SVN: r272993
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/builtins.c | 17 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr90892.c | 14 |
4 files changed, 39 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f2f69905f76..a1d7c5bedd7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2019-07-03 Martin Liska <mliska@suse.cz> + PR tree-optimization/90892 + * builtins.c (inline_expand_builtin_string_cmp): Handle '\0' + in string constants. + +2019-07-03 Martin Liska <mliska@suse.cz> + PR middle-end/90899 * multiple_target.c (create_dispatcher_calls): Add to comdat group only if set for ifunc. 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,5 +1,10 @@ 2019-07-03 Martin Liska <mliska@suse.cz> + PR tree-optimization/90892 + * gcc.dg/pr90892.c: New test. + +2019-07-03 Martin Liska <mliska@suse.cz> + PR middle-end/90899 * gcc.target/i386/pr90899.c: New test. 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; +} |