for gcc/ChangeLog from Alexandre Oliva * tree-flow-inline.h (op_iter_init): Reject GIMPLE_PHI stmts. (num_ssa_operands): Skip GIMPLE_PHI. (delink_stmt_imm_use): Likewise. * tree-ssa-pre.c (remove_dead_inserted_code): Likewise. Index: gcc/tree-flow-inline.h =================================================================== --- gcc/tree-flow-inline.h.orig 2009-11-18 18:06:04.000000000 -0200 +++ gcc/tree-flow-inline.h 2009-11-18 18:13:13.000000000 -0200 @@ -801,6 +801,8 @@ op_iter_init (ssa_op_iter *ptr, gimple s iterating over defs or uses at the same time. */ gcc_assert ((!(flags & SSA_OP_VDEF) || (flags & SSA_OP_DEF)) && (!(flags & SSA_OP_VUSE) || (flags & SSA_OP_USE))); + /* PHI nodes require a different iterator initialization path. */ + gcc_assert (gimple_code (stmt) != GIMPLE_PHI); ptr->defs = (flags & (SSA_OP_DEF|SSA_OP_VDEF)) ? gimple_def_ops (stmt) : NULL; if (!(flags & SSA_OP_VDEF) && ptr->defs @@ -928,8 +930,9 @@ num_ssa_operands (gimple stmt, int flags tree t; int num = 0; - FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags) - num++; + if (gimple_code (stmt) != GIMPLE_PHI) + FOR_EACH_SSA_TREE_OPERAND (t, stmt, iter, flags) + num++; return num; } @@ -941,7 +944,8 @@ delink_stmt_imm_use (gimple stmt) ssa_op_iter iter; use_operand_p use_p; - if (ssa_operands_active ()) + if (ssa_operands_active () + && gimple_code (stmt) != GIMPLE_PHI) FOR_EACH_SSA_USE_OPERAND (use_p, stmt, iter, SSA_OP_ALL_USES) delink_imm_use (use_p); } Index: gcc/tree-ssa-pre.c =================================================================== --- gcc/tree-ssa-pre.c.orig 2009-11-18 18:23:32.000000000 -0200 +++ gcc/tree-ssa-pre.c 2009-11-18 18:23:46.000000000 -0200 @@ -4462,8 +4462,10 @@ remove_dead_inserted_code (void) if (gimple_code (t) == GIMPLE_PHI) remove_phi_node (&gsi, true); else - gsi_remove (&gsi, true); - release_defs (t); + { + gsi_remove (&gsi, true); + release_defs (t); + } } } VEC_free (gimple, heap, worklist);