summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.dg/pr50613.c20
-rw-r--r--gcc/tree-ssa-strlen.c12
4 files changed, 40 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 800d69aab78..b37b082fa4b 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,10 @@
+2011-10-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/50613
+ * tree-ssa-strlen.c (find_equal_ptrs): If CASE_CONVERT
+ operand is ADDR_EXPR, fallthru into ADDR_EXPR handling,
+ and if it is neither that not SSA_NAME, give up.
+
2011-10-05 Richard Henderson <rth@redhat.com>
* tree-vect-generic.c (vector_element): Never fail. Use
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4ad91390b2a..df734609154 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2011-10-05 Jakub Jelinek <jakub@redhat.com>
+
+ PR tree-optimization/50613
+ * gcc.dg/pr50613.c: New test.
+
2011-10-05 Richard Henderson <rth@redhat.com>
* gcc.c-torture/execute/vect-shuffle-1.c: Rewrite.
diff --git a/gcc/testsuite/gcc.dg/pr50613.c b/gcc/testsuite/gcc.dg/pr50613.c
new file mode 100644
index 00000000000..27c6fba3636
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/pr50613.c
@@ -0,0 +1,20 @@
+/* PR tree-optimization/50613 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-tree-ccp" } */
+
+#include "strlenopt.h"
+
+char buf[26];
+
+static inline void
+bar (char *__restrict dest, const char *__restrict src)
+{
+ strcpy (dest, src);
+}
+
+void
+foo (char *p)
+{
+ if (strlen (p) < 50)
+ bar (buf, p);
+}
diff --git a/gcc/tree-ssa-strlen.c b/gcc/tree-ssa-strlen.c
index b2ee2f96f44..d997c73451e 100644
--- a/gcc/tree-ssa-strlen.c
+++ b/gcc/tree-ssa-strlen.c
@@ -692,6 +692,14 @@ find_equal_ptrs (tree ptr, int idx)
{
case SSA_NAME:
break;
+ CASE_CONVERT:
+ if (!POINTER_TYPE_P (TREE_TYPE (ptr)))
+ return;
+ if (TREE_CODE (ptr) == SSA_NAME)
+ break;
+ if (TREE_CODE (ptr) != ADDR_EXPR)
+ return;
+ /* FALLTHRU */
case ADDR_EXPR:
{
int *pidx = addr_stridxptr (TREE_OPERAND (ptr, 0));
@@ -699,10 +707,6 @@ find_equal_ptrs (tree ptr, int idx)
*pidx = idx;
return;
}
- CASE_CONVERT:
- if (POINTER_TYPE_P (TREE_TYPE (ptr)))
- break;
- return;
default:
return;
}