aboutsummaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.dg/strlenopt-92.c
diff options
context:
space:
mode:
authorMartin Sebor <msebor@redhat.com>2020-02-05 16:55:26 -0700
committerMartin Sebor <msebor@redhat.com>2020-02-05 16:55:26 -0700
commite7868dc6a79daec4f46552fa5c99f88e4eb8de4c (patch)
tree0fad493958df5c30eebb8192fd46c5f287379396 /gcc/testsuite/gcc.dg/strlenopt-92.c
parentf6bef09771cf93e695cf719fb43db8c43e31acf5 (diff)
downloadgcc-e7868dc6a79daec4f46552fa5c99f88e4eb8de4c.zip
gcc-e7868dc6a79daec4f46552fa5c99f88e4eb8de4c.tar.gz
gcc-e7868dc6a79daec4f46552fa5c99f88e4eb8de4c.tar.bz2
PR tree-optimization/92765 - wrong code for strcmp of a union member
gcc/ChangeLog: PR tree-optimization/92765 * gimple-fold.c (get_range_strlen_tree): Handle MEM_REF and PARM_DECL. * tree-ssa-strlen.c (compute_string_length): Remove. (determine_min_objsize): Remove. (get_len_or_size): Add an argument. Call get_range_strlen_dynamic. Avoid using type size as the upper bound on string length. (handle_builtin_string_cmp): Add an argument. Adjust. (strlen_check_and_optimize_call): Pass additional argument to handle_builtin_string_cmp. gcc/testsuite/ChangeLog: PR tree-optimization/92765 * g++.dg/tree-ssa/strlenopt-1.C: New test. * g++.dg/tree-ssa/strlenopt-2.C: New test. * gcc.dg/Warray-bounds-58.c: New test. * gcc.dg/Wrestrict-20.c: Avoid a valid -Wformat-overflow. * gcc.dg/Wstring-compare.c: Xfail a test. * gcc.dg/strcmpopt_2.c: Disable tests. * gcc.dg/strcmpopt_4.c: Adjust tests. * gcc.dg/strcmpopt_10.c: New test. * gcc.dg/strcmpopt_11.c: New test. * gcc.dg/strlenopt-69.c: Disable tests. * gcc.dg/strlenopt-92.c: New test. * gcc.dg/strlenopt-93.c: New test. * gcc.dg/strlenopt.h: Declare calloc. * gcc.dg/tree-ssa/pr92056.c: Xfail tests until pr93518 is resolved. * gcc.dg/tree-ssa/builtin-sprintf-warn-23.c: Correct test (pr93517).
Diffstat (limited to 'gcc/testsuite/gcc.dg/strlenopt-92.c')
-rw-r--r--gcc/testsuite/gcc.dg/strlenopt-92.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.dg/strlenopt-92.c b/gcc/testsuite/gcc.dg/strlenopt-92.c
new file mode 100644
index 0000000..a9383e6
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/strlenopt-92.c
@@ -0,0 +1,58 @@
+/* PR tree-optimization/92765 - wrong code for strcmp of a union member
+ { dg-do run }
+ { dg-options "-O2 -Wall" } */
+
+#include "strlenopt.h"
+
+__attribute__((noipa)) int
+copy (char *x, int y)
+{
+ if (y == 0)
+ strcpy (x, "abcd");
+ return y;
+}
+
+__attribute__((noipa)) char *
+alloc_2_copy_compare (int x)
+{
+ char *p;
+ if (x)
+ p = malloc (4);
+ else
+ p = calloc (16, 1);
+
+ char *q = p + 2;
+ if (copy (q, x))
+ return p;
+
+ if (strcmp (q, "abcd") != 0)
+ abort ();
+
+ return p;
+}
+
+char a5[5], a6[6], a7[7];
+
+__attribute__((noipa)) char *
+decl_3_copy_compare (int x)
+{
+ char *p = x < 0 ? a5 : 0 < x ? a6 : a7;
+ char *q = p + 1;
+ if (copy (q, x))
+ return p;
+
+ if (strcmp (q, "abcd") != 0)
+ abort ();
+
+ return p;
+}
+
+int main ()
+{
+ free (alloc_2_copy_compare (0));
+ free (alloc_2_copy_compare (1));
+
+ decl_3_copy_compare (-1);
+ decl_3_copy_compare (0);
+ decl_3_copy_compare (1);
+}