Message ID | 20111005113131.GS19412@tyan-ft48-01.lab.bos.redhat.com |
---|---|
State | New |
Headers | show |
On Wed, Oct 5, 2011 at 1:31 PM, Jakub Jelinek <jakub@redhat.com> wrote: > 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? Ok. Thanks, Richard. > 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. > > * 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 >
--- 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); +}