diff options
author | msebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-07-05 16:42:50 +0000 |
---|---|---|
committer | msebor <msebor@138bc75d-0d04-0410-961f-82ee72b054a4> | 2018-07-05 16:42:50 +0000 |
commit | 17961180ab4f51436f65cb127ab232b5aac8f40d (patch) | |
tree | c0b35c25454e8ac68eb9d7b7d2010f5527c6effd | |
parent | fa8d5450e50e62135a9993dfe63e9cb7a568372b (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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/strlenopt-47.c | 36 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/strlenopt-48.c | 35 | ||||
-rw-r--r-- | gcc/tree-ssa-strlen.c | 8 |
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); } } |