Hi!

I didn't consider that the rhs1 of a gimple cast might be something
other than SSA_NAME.  Fixed thusly, bootstrapped/regtested on x86_64-linux
and i686-linux, ok for trunk?

2011-10-05  Jakub Jelinek  <ja...@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.

        * gcc.dg/pr50613.c: New test.

--- gcc/tree-ssa-strlen.c.jj    2011-10-05 08:13:55.000000000 +0200
+++ gcc/tree-ssa-strlen.c       2011-10-05 08:19:16.000000000 +0200
@@ -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;
        }
--- gcc/testsuite/gcc.dg/pr50613.c.jj   2011-10-05 08:22:32.000000000 +0200
+++ gcc/testsuite/gcc.dg/pr50613.c      2011-10-05 08:21:31.000000000 +0200
@@ -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);
+}

        Jakub

Reply via email to