On Tue, Apr 13, 2010 at 13:14, Sebastian Pop <seb...@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