Message ID | 20170627054632.GM2123@tucnak |
---|---|
State | New |
Headers | show |
On Tue, 27 Jun 2017, Jakub Jelinek wrote: > Hi! > > replace_call_with_call_and_fold has code to copy over vdef/vuse from the > old call to the new one, so that we don't have to update virtual ssa, > but it is conditioned on gimple_vdef being non-NULL and SSA_NAME. > If we have a pure function, gimple_vdef is NULL, yet we still want to copy > over the vuse. > > Bootstrapped/regtested on x86_64-linux (i686-linux fails to bootstrap > with/without this patch), ok for trunk? Ok with ... > 2017-06-27 Jakub Jelinek <jakub@redhat.com> > > PR middle-end/81207 > * gimple-fold.c (replace_call_with_call_and_fold): Handle > gimple_vuse copying separately from gimple_vdef copying. > > * gcc.c-torture/compile/pr81207.c: New test. > > --- gcc/gimple-fold.c.jj 2017-06-19 08:28:11.000000000 +0200 > +++ gcc/gimple-fold.c 2017-06-26 17:09:34.735420583 +0200 > @@ -607,9 +607,11 @@ replace_call_with_call_and_fold (gimple_ > && TREE_CODE (gimple_vdef (stmt)) == SSA_NAME) > { > gimple_set_vdef (repl, gimple_vdef (stmt)); > - gimple_set_vuse (repl, gimple_vuse (stmt)); > SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl; > } > + if (gimple_vuse (stmt) > + && TREE_CODE (gimple_vuse (stmt)) == SSA_NAME) ... the SSA_NAME check removed. It's done above because we access SSA_NAME_DEF_STMT, here it isn't necessary. > + gimple_set_vuse (repl, gimple_vuse (stmt)); > gsi_replace (gsi, repl, false); > fold_stmt (gsi); > } > --- gcc/testsuite/gcc.c-torture/compile/pr81207.c.jj 2017-06-26 17:21:38.765918367 +0200 > +++ gcc/testsuite/gcc.c-torture/compile/pr81207.c 2017-06-26 17:27:15.222966965 +0200 > @@ -0,0 +1,13 @@ > +/* PR middle-end/81207 */ > + > +static const char *b[2] = { "'", "" }; > + > +int > +foo (const char *d) > +{ > + int e; > + for (e = 0; b[e]; e++) > + if (__builtin_strstr (d, b[e])) > + return 1; > + return 0; > +} > > Jakub > >
--- gcc/gimple-fold.c.jj 2017-06-19 08:28:11.000000000 +0200 +++ gcc/gimple-fold.c 2017-06-26 17:09:34.735420583 +0200 @@ -607,9 +607,11 @@ replace_call_with_call_and_fold (gimple_ && TREE_CODE (gimple_vdef (stmt)) == SSA_NAME) { gimple_set_vdef (repl, gimple_vdef (stmt)); - gimple_set_vuse (repl, gimple_vuse (stmt)); SSA_NAME_DEF_STMT (gimple_vdef (repl)) = repl; } + if (gimple_vuse (stmt) + && TREE_CODE (gimple_vuse (stmt)) == SSA_NAME) + gimple_set_vuse (repl, gimple_vuse (stmt)); gsi_replace (gsi, repl, false); fold_stmt (gsi); } --- gcc/testsuite/gcc.c-torture/compile/pr81207.c.jj 2017-06-26 17:21:38.765918367 +0200 +++ gcc/testsuite/gcc.c-torture/compile/pr81207.c 2017-06-26 17:27:15.222966965 +0200 @@ -0,0 +1,13 @@ +/* PR middle-end/81207 */ + +static const char *b[2] = { "'", "" }; + +int +foo (const char *d) +{ + int e; + for (e = 0; b[e]; e++) + if (__builtin_strstr (d, b[e])) + return 1; + return 0; +}