This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Copy assignments for non scalar types
- From: Sebastian Pop <sebpop at gmail dot com>
- To: gcc at gcc dot gnu dot org, Richard Guenther <rguenther at suse dot de>, Diego Novillo <dnovillo at google dot com>
- Date: Tue, 13 Apr 2010 14:42:55 -0500
- Subject: Re: Copy assignments for non scalar types
- References: <y2qcb9d34b21004131114h70237e6cj24e7a5c529d584d1@mail.gmail.com>
On Tue, Apr 13, 2010 at 13:14, Sebastian Pop <sebpop@gmail.com> wrote:
> Hi,
>
> While working on the tree-if-conv.c, I realized that the copy
> of the contents of a non scalar variable are not correctly done.
> The copy assignment triggers this error:
>
> error: virtual SSA name for non-VOP decl
> while verifying SSA_NAME _ifc_.2005_46 in statement
> # .MEM_394 = VDEF <.MEM_475>
> ? ?_ifc_.2005_46 = ops[j_457];
>
> The array reference looks like this:
>
> ?<array_ref 0x7ffff4bd65a0
> ? ?type <record_type 0x7ffff4ee2c78 simplify_plus_minus_op_data
> sizes-gimplified asm_written type_0 BLK
>
> For scalar types, the code that creates the copy is working correctly:
>
> /* Create a new temp variable of type TYPE. ?Add GIMPLE_ASSIGN to assign EXP
> ? to the new variable. ?*/
>
> static gimple
> ifc_temp_var (tree type, tree exp)
> {
> ?const char *name = "_ifc_";
> ?tree var, new_name;
> ?gimple stmt;
>
> ?/* Create new temporary variable. ?*/
> ?var = create_tmp_var (type, name);
> ?add_referenced_var (var);
>
> ?/* Build new statement to assign EXP to new variable. ?*/
> ?stmt = gimple_build_assign (var, exp);
>
> ?/* Get SSA name for the new variable and set make new statement
> ? ? its definition statement. ?*/
> ?new_name = make_ssa_name (var, stmt);
> ?gimple_assign_set_lhs (stmt, new_name);
> ?SSA_NAME_DEF_STMT (new_name) = stmt;
> ?update_stmt (stmt);
>
> ?return stmt;
> }
>
> What is missing in this function to make it handle non scalar types?
>
At least this is missing (but it is not enough, so I am still looking for
a solution):
if (gimple_referenced_vars (cfun))
{
add_referenced_var (t);
mark_sym_for_renaming (t);
}
from tree-dfa.c:
/* Build a temporary. Make sure and register it to be renamed. */
tree
make_rename_temp (tree type, const char *prefix)
{
tree t = create_tmp_var (type, prefix);
if (TREE_CODE (TREE_TYPE (t)) == COMPLEX_TYPE
|| TREE_CODE (TREE_TYPE (t)) == VECTOR_TYPE)
DECL_GIMPLE_REG_P (t) = 1;
if (gimple_referenced_vars (cfun))
{
add_referenced_var (t);
mark_sym_for_renaming (t);
}
return t;
}
I will replace the call to create_tmp_var with make_rename_temp.
Sebastian