[committed, gomp4] Fix release_dangling_ssa_names

Tom de Vries Tom_deVries@mentor.com
Wed Aug 5 08:48:00 GMT 2015


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



More information about the Gcc-patches mailing list