On 05/08/15 09:29, Richard Biener wrote:
This patch fixes that by making sure we reset the def stmt to NULL. This means
>we can simplify release_dangling_ssa_names to just test for NULL def stmts.
Not sure if I understand the problem correctly but why are you not simply
releasing the SSA name when you remove its definition?

In move_sese_region_to_fn we move a region of blocks from one function to another, bit by bit.

When we encounter an ssa_name as def or use in the region, we:
- generate a new ssa_name,
- set the def stmt of the old name as def stmt of the new name, and
- add a mapping from the old to the new name.
The next time we encounter the same ssa_name in another statement, we find it in the map.

If we release the old ssa name, we effectively create statements with operands in the free-list. The first point where that cause breakage, is in walk_gimple_op, which expects the TREE_TYPE of the lhs of an assign to be defined, which is not the case if it's in the free-list:
...
case GIMPLE_ASSIGN:
  /* Walk the RHS operands.  If the LHS is of a non-renamable type or
     is a register variable, we may use a COMPONENT_REF on the RHS.*/
  if (wi)
    {
      tree lhs = gimple_assign_lhs (stmt);
      wi->val_only
        = (is_gimple_reg_type (TREE_TYPE (lhs)) && !is_gimple_reg (lhs))
           || gimple_assign_rhs_class (stmt) != GIMPLE_SINGLE_RHS;
    }
...

Thanks,
- Tom

Reply via email to