[PATCH] Fix cond updating in tree-ssa-dom (PR tree-optimization/77454)
Jakub Jelinek
jakub@redhat.com
Tue Sep 13 13:52:00 GMT 2016
On Tue, Sep 13, 2016 at 03:21:47PM +0200, Richard Biener wrote:
> > The following testcase ICEs because SSA_NAME IMM links are broken.
> > I've tracked it to DOM's optimize_stmt, a GIMPLE_COND in there is
> > changed, marked as modified, then in optimize_stmt
> > if (gimple_modified_p (stmt) || modified_p)
> > {
> > tree val = NULL;
> >
> > update_stmt_if_modified (stmt);
> > and a few lines later changed again:
> > if (gimple_code (stmt) == GIMPLE_COND)
> > {
> > if (integer_zerop (val))
> > gimple_cond_make_false (as_a <gcond *> (stmt));
> > else if (integer_onep (val))
> > gimple_cond_make_true (as_a <gcond *> (stmt));
> > without update_stmt. As this is a function which update_stmt_if_modified
> > a few lines before, I think it is fine to update_stmt it immediately.
> >
> > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> Ok if it doesn't do the update twice this way (we do it the "fancy way" to
> only update stmts we modified and do it only once).
It does update it twice this way, the
update_stmt_if_modified (stmt);
above is done first and then the newly added update_stmt again.
There is
if (gimple_code (stmt) == GIMPLE_COND)
val = fold_binary_loc (gimple_location (stmt),
gimple_cond_code (stmt), boolean_type_node,
gimple_cond_lhs (stmt), gimple_cond_rhs (stmt));
else if (gswitch *swtch_stmt = dyn_cast <gswitch *> (stmt))
val = gimple_switch_index (swtch_stmt);
if (val && TREE_CODE (val) == INTEGER_CST)
{
retval = find_taken_edge (bb, val);
and gimple_cond_make_{false,true} in between. If none of these care about
the stmt being updated (gimple_cond_make_{false,true} and
gimple_switch_index is surely ok, dyn_cast too, not 100% sure about
fold_binary (if it can't use match.pd, though on the other side it is not
passed the stmt, but only its arguments), or find_taken_edge (most likely
ok)), then I could perhaps change the patch to do gimple_set_modified (stmt,
true); where I've added the update_stmt, and move the
update_stmt_if_modified call after the if (val && TREE_CODE (val) ==
INTEGER_CST) { ... } stmt.
Jakub
More information about the Gcc-patches
mailing list