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