[PATCH][RFC] Fix PR59860
Richard Biener
rguenther@suse.de
Mon Jan 20 13:38:00 GMT 2014
On Mon, 20 Jan 2014, Jakub Jelinek wrote:
> On Mon, Jan 20, 2014 at 01:35:05PM +0100, Richard Biener wrote:
> > > tree-ssa-strlen.c apparently both doesn't this case (unknown first strlen,
> > > known second strlen or movstr pattern, will only transform that if the
> > > length of the resulting string is needed afterwards), and isn't run
> > > for -Os or -O1 anyway.
> >
> > Well, I'm not sure under which circumstances this should be an
> > unconditional win anyway (I expect the strcat library fn to be
> > optimized well enough, and only if you can avoid the strlen on the
> > dest in the end it will be profitable)
>
> No, while the strcat library fn can be very optimized, it still has no info
> about how long the second parameter is. strcat is implementation is
> typically an optimized strchr (dst, 0) followed by an optimized strcpy,
> where the two can perhaps avoid some alignment adjustments or something.
> But the strcpy still has to for each word or whatever chunk it reads test
> for terminating zeros, while if you do an (optimized) strlen followed by
> memcpy where you already know the length, that is a win.
Well, strcat itself can do that ... but yes, as I said, if you can
CSE that strlen call then it's a win. But you can't know this without
more context.
> > > But I guess if we optimize it again, your testcase would crash again, right?
> >
> > Right. We can apply the optimization at RTL expansion time though,
> > or handle the folding completely in gimple-fold with not needing to
> > dispatch to the gimplifier.
>
> After playing with the testcase in a debugger, my strong preference at
> least for the 4.8 branch would be just a global flag (or context flag) to prevent
> the nested folding. I think the only problematic thing is what starts with
> the avoid_folding_inline_builtin check in gimple_fold_builtin, and we should
> just prevent that from happening when called from within
> gimplify_and_update_call_from_tree (or just during that call when called
> from gimple_fold_call?).
Yes, that is the piece that is the problem (iff otherwise recursive
folding would never fold anything).
> Normally, if folding of a builtin folds it into a call to some other
> builtin, that other builtin is folded right away, so the common case is
> optimized immediately, the only problem is if gimple_fold_builtin tries
> harder to optimize using maximum lengths or exact length (as in this case).
> And, for this it wouldn't even help if we handled STRCAT/STRCAT_CHK
> specially too and passed the src length to the folder routine, because
> gimple_fold_builtin first folds normally and only if that fails, attempts
> harder.
But we still can re-introduce the folding I removed from builtins.c
below the avoid_folding_inline_builtin section as in that case
builtins.c didn't do the folding and the gimple folding has
strictly more information. No? I don't really like a special
flag ... if, then I'd rather have a flag to tell the gimplfier
not to fold stmts which we can set on the gimpifier context
we push in gimplify_and_update_call_from_tree.
Btw, I already applied the patch (I can of course revert it if
we arrive at a better solution). I don't think I removed an
important optimization (in fact usually it will be a pessimization
if the strlen cannot be re-used - sth tree-ssa-strlen should be
able to figure out).
Richard.
More information about the Gcc-patches
mailing list