[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