This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Copy assignments for non scalar types


On Tue, 13 Apr 2010, Sebastian Pop wrote:

> 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.

No.  make_rename_temp should go away.  Please.

Btw, you can't make an SSA name of aggregate type.

Richard.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]