summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormsebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4>2018-07-05 16:42:50 +0000
committermsebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4>2018-07-05 16:42:50 +0000
commit17961180ab4f51436f65cb127ab232b5aac8f40d (patch)
treec0b35c25454e8ac68eb9d7b7d2010f5527c6effd
parentfa8d5450e50e62135a9993dfe63e9cb7a568372b (diff)
Backport from trunk.
PR tree-optimization/86400 - set<string>::set<char (*)[2]) constructor does not work with array argument. gcc/ChangeLog: * gcc.dg/strlenopt-47.c: New test. * gcc.dg/strlenopt-48.c: New test. gcc/testsuite/ChangeLog: * gcc.dg/strlenopt-47.c: New test. * gcc.dg/strlenopt-48.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-8-branch@262446 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog6
-rw-r--r--gcc/testsuite/gcc.dg/strlenopt-47.c36
-rw-r--r--gcc/testsuite/gcc.dg/strlenopt-48.c35
-rw-r--r--gcc/tree-ssa-strlen.c8
5 files changed, 88 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 05892b482951..b75cb76afa24 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-05 Martin Sebor <msebor@redhat.com>
+
+ PR c++/86400
+ * tree-ssa-strlen.c (maybe_set_strlen_range): Use type size rather
+ than its domain to compute its the upper bound of a char array.
+
2018-07-03 Carl Love <cel@us.ibm.com>
Backport from trunk
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 3f36dc0ee858..bc7d508d2cf8 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2018-07-05 Martin Sebor <msebor@redhat.com>
+
+ PR c++/86400
+ * gcc.dg/strlenopt-47.c: New test.
+ * gcc.dg/strlenopt-48.c: New test.
+
2018-07-03 Carl Love <cel@us.ibm.com>
Backport from trunk
diff --git a/gcc/testsuite/gcc.dg/strlenopt-47.c b/gcc/testsuite/gcc.dg/strlenopt-47.c
new file mode 100644
index 000000000000..68945c7c1a19
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/strlenopt-47.c
@@ -0,0 +1,36 @@
+/* PR tree-optimization/86400 - set<string>::set<char (*)[2]) constructor
+ does not work with array argument
+ Verify that strlen() calls with two-character array elements of
+ multidimensional arrays whose higher order dimension is 1 are not
+ folded.
+ { dg-do compile }
+ { dg-options "-O2 -Wall -fdump-tree-optimized" } */
+
+#include "strlenopt.h"
+
+void f (void)
+{
+ extern char a[1][2];
+ int n = strlen (*a);
+ if (n != 1)
+ abort();
+}
+
+void g (void)
+{
+ extern char b[1][2];
+ int n = strlen (b[0]);
+ if (n != 1)
+ abort();
+}
+
+void h (void)
+{
+ extern char c[1][2];
+ int n = strlen (&c[0][0]);
+ if (n != 1)
+ abort();
+}
+
+/* { dg-final { scan-tree-dump-times "= strlen" 3 "optimized" } }
+ { dg-final { scan-tree-dump-times "abort" 3 "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/strlenopt-48.c b/gcc/testsuite/gcc.dg/strlenopt-48.c
new file mode 100644
index 000000000000..39bb32df6dd1
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/strlenopt-48.c
@@ -0,0 +1,35 @@
+/* PR tree-optimization/86400 - set<string>::set<char (*)[2]) constructor
+ does not work with array argument
+ Verify that strlen() calls with one-character array elements of
+ multidimensional arrays are still folded.
+ { dg-do compile }
+ { dg-options "-O2 -Wall -fdump-tree-optimized" } */
+
+#include "strlenopt.h"
+
+void f (void)
+{
+ extern char a[2][1];
+ int n = strlen (a[1]);
+ if (n)
+ abort();
+}
+
+void g (void)
+{
+ extern char b[3][2][1];
+ int n = strlen (b[2][1]);
+ if (n)
+ abort();
+}
+
+void h (void)
+{
+ extern char c[4][3][2][1];
+ int n = strlen (c[3][2][1]);
+ if (n)
+ abort();
+}
+
+/* { dg-final { scan-tree-dump-times "strlen" 0 "optimized" } }
+ { dg-final { scan-tree-dump-times "abort" 0 "optimized" } } */
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index 87d3d0d043a6..ca42386d4454 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -1186,11 +1186,13 @@ maybe_set_strlen_range (tree lhs, tree src)
return;
tree type = TREE_TYPE (src);
- if (tree dom = TYPE_DOMAIN (type))
- if (tree maxval = TYPE_MAX_VALUE (dom))
+ if (tree size = TYPE_SIZE_UNIT (type))
+ if (size && TREE_CODE (size) == INTEGER_CST)
{
- wide_int max = wi::to_wide (maxval);
+ wide_int max = wi::to_wide (size);
wide_int min = wi::zero (max.get_precision ());
+ if (max != 0)
+ --max;
set_range_info (lhs, VR_RANGE, min, max);
}
}