On Mon, Oct 24, 2011 at 07:15:14PM +0200, Andreas Krebbel wrote:
> + if (dsi->prev != 0 && (chainsi = verify_related_strinfos (dsi)) !=
> NULL)
> + {
> + bool stmt_set_p = false;
> +
> + for (; chainsi && chainsi != dsi; chainsi = get_strinfo
> (chainsi->next))
> + {
> + /* When setting a stmt for delayed length computation
> + prevent all strinfos through dsi from being
> + invalidated. */
> + if (stmt_set_p)
> + chainsi->dont_invalidate = true;
> +
> + chainsi = unshare_strinfo (chainsi);
> + chainsi->stmt = stmt;
> + chainsi->length = NULL_TREE;
> + chainsi->endptr = NULL_TREE;
> + chainsi->dont_invalidate = true;
> + stmt_set_p = true;
> + }
> + }
Can you please explain this stmt_set_p stuff? dont_invalidate should be
only set on strinfos that will be seen by the immediately following
maybe_invalidate call (at the end of handle_builtin_strcpy caller -
strlen_optimize_stmt). If you set it on which unshare_strinfo is called,
if there is no unsharing, it is obviously fine, but if there is unsharing,
then dont_invalidate will be set on some strinfo that won't be seen by the
next may_invalidate. It might trigger in some other basic block and might
cause wrong code.
Otherwise it looks good.
Jakub