Handle '\0' in strcmp in RTL expansion (PR tree-optimization/90892).
authorMartin Liska <mliska@suse.cz>
Wed, 3 Jul 2019 08:32:25 +0000 (10:32 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Wed, 3 Jul 2019 08:32:25 +0000 (08:32 +0000)
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

gcc/ChangeLog
gcc/builtins.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr90892.c [new file with mode: 0644]

index f2f69905f76b75b62d581fbe87b931f03e330295..a1d7c5bedd72f3e7205ae7450a19dbefc6f49177 100644 (file)
@@ -1,3 +1,9 @@
+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
index 2b8914f13ee1ab34828439c0ad23a228ecd19903..e2ba356c0d396ce2f6f10237fc5e98b699c8972c 100644 (file)
@@ -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,
index 512e86cf2cbf590b6de1b232975a36be7c1b9291..d55211232308bbb1a1c24514d109cf60d2728f34 100644 (file)
@@ -1,3 +1,8 @@
+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
diff --git a/gcc/testsuite/gcc.dg/pr90892.c b/gcc/testsuite/gcc.dg/pr90892.c
new file mode 100644 (file)
index 0000000..e4b5310
--- /dev/null
@@ -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;
+}