While we should already be in loop-closed SSA form for virtual operands most of the time (because we have a virtual use at the return statement) and loop-closed SSA form for virtuals is cheap (we only have a single virtual operand now) the following makes sure that a loop-closed PHI node for virtuals does exist.
Nobody makes use of the fact but ISTR code that has code explicitely dealing with the situation that virtuals are _not_ in loop-closed SSA form. Testing pending. Richard. 2012-08-22 Richard Guenther <rguent...@suse.de> * tree-ssa-loop-manip.c (add_exit_phis_var): Allow virtual operands. (find_uses_to_rename_use): Likewise. (find_uses_to_rename_bb): Likewise. (find_uses_to_rename_stmt): Walk over all operands. Index: gcc/tree-ssa-loop-manip.c =================================================================== --- gcc/tree-ssa-loop-manip.c (revision 190590) +++ gcc/tree-ssa-loop-manip.c (working copy) @@ -303,8 +303,7 @@ add_exit_phis_var (tree var, bitmap use_ basic_block def_bb = gimple_bb (SSA_NAME_DEF_STMT (var)); bitmap live_exits = BITMAP_ALLOC (&loop_renamer_obstack); - gcc_checking_assert (! virtual_operand_p (var)); - gcc_assert (! bitmap_bit_p (use_blocks, def_bb->index)); + gcc_checking_assert (! bitmap_bit_p (use_blocks, def_bb->index)); compute_live_loop_exits (live_exits, use_blocks, loop_exits, def_bb); @@ -367,10 +366,6 @@ find_uses_to_rename_use (basic_block bb, if (TREE_CODE (use) != SSA_NAME) return; - /* We don't need to keep virtual operands in loop-closed form. */ - if (virtual_operand_p (use)) - return; - ver = SSA_NAME_VERSION (use); def_bb = gimple_bb (SSA_NAME_DEF_STMT (use)); if (!def_bb) @@ -408,7 +403,7 @@ find_uses_to_rename_stmt (gimple stmt, b if (is_gimple_debug (stmt)) return; - FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_USE) + FOR_EACH_SSA_TREE_OPERAND (var, stmt, iter, SSA_OP_ALL_USES) find_uses_to_rename_use (bb, var, use_blocks, need_phis); } @@ -428,9 +423,8 @@ find_uses_to_rename_bb (basic_block bb, for (bsi = gsi_start_phis (e->dest); !gsi_end_p (bsi); gsi_next (&bsi)) { gimple phi = gsi_stmt (bsi); - if (! virtual_operand_p (gimple_phi_result (phi))) - find_uses_to_rename_use (bb, PHI_ARG_DEF_FROM_EDGE (phi, e), - use_blocks, need_phis); + find_uses_to_rename_use (bb, PHI_ARG_DEF_FROM_EDGE (phi, e), + use_blocks, need_phis); } for (bsi = gsi_start_bb (bb); !gsi_end_p (bsi); gsi_next (&bsi))