summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGary Oblock <gary@amperecomputing.com>2020-06-19 21:09:36 -0700
committerGary Oblock <gary@amperecomputing.com>2020-06-19 21:09:36 -0700
commit134a05537af83c3b04b36a7eebacbce6b05487db (patch)
tree5660547f77da0043b68b3bbf194d27d2fd85949d
parent35e226d2866a18045a97942b03ca593901f7a79b (diff)
had to rewrite a part of element access code... and it's not working yet
-rw-r--r--gcc/ipa-str-reorg-instance-interleave.c155
1 files changed, 96 insertions, 59 deletions
diff --git a/gcc/ipa-str-reorg-instance-interleave.c b/gcc/ipa-str-reorg-instance-interleave.c
index be7596bbed4..a63597e5cca 100644
--- a/gcc/ipa-str-reorg-instance-interleave.c
+++ b/gcc/ipa-str-reorg-instance-interleave.c
@@ -73,6 +73,9 @@ str_reorg_instance_interleave_qual ( Info *info)
int
str_reorg_instance_interleave_trans ( Info *info)
{
+
+ DEBUG_L("Start of str_reorg_instance_interleave_trans:\n");
+ DEBUG_F( print_program, stderr, 4);
struct cgraph_node *node;
FOR_EACH_FUNCTION_WITH_GIMPLE_BODY ( node) {
struct function *func = DECL_STRUCT_FUNCTION ( node->decl);
@@ -80,7 +83,7 @@ str_reorg_instance_interleave_trans ( Info *info)
push_cfun ( func);
if ( info->show_transforms )
{
- fprintf( dump_file, "Function \"%s\":\n",
+ fprintf( info->reorg_dump_file, "Function \"%s\":\n",
//IDENTIFIER_POINTER( DECL_NAME( func)));
//IDENTIFIER_POINTER( DECL_NAME( func->decl)));
lang_hooks.decl_printable_name ( node->decl, 2));
@@ -92,7 +95,7 @@ str_reorg_instance_interleave_trans ( Info *info)
if( info->show_transforms )
{
- fprintf( dump_file, " Transforming BB%i:\n",
+ fprintf( info->reorg_dump_file, " Transforming BB%i:\n",
bb->index);
}
@@ -108,7 +111,13 @@ str_reorg_instance_interleave_trans ( Info *info)
// else is an error.
gimple *stmt = gsi_stmt ( outer_gsi);
ReorgType_t *ri = contains_a_reorgtype( stmt, info);
- if ( ri != NULL )
+ if ( ri == NULL )
+ {
+ DEBUG_L("No Transfrom on: ");
+ DEBUG_F( print_gimple_expr, stderr, stmt, 4, TDF_SLIM);
+ DEBUG("\n");
+ }
+ else
{
DEBUG_F( print_reorg_with_msg, stderr, ri, 0,
"reorg from str_reorg_instance_interleave_trans");
@@ -118,7 +127,7 @@ str_reorg_instance_interleave_trans ( Info *info)
// print out trans and stmt if dumping
if ( info->show_transforms )
{
- print_gimple_expr( dump_file, stmt, 4, TDF_SLIM);
+ print_gimple_expr( info->reorg_dump_file, stmt, 4, TDF_SLIM);
}
switch ( trans)
@@ -212,34 +221,34 @@ str_reorg_instance_interleave_trans ( Info *info)
tree field_type = TREE_TYPE( orig_field);
tree base = ri->instance_interleave.base;
- DEBUG_L("base: %p\n", base); DEBUG("\n");
+ DEBUG_L("base: %p\n", base);
+ DEBUG_L("base: ");
+ DEBUG_F(print_generic_expr, stderr, base, (dump_flags_t)-1);
+ DEBUG("\n");
tree base_field =
find_coresponding_field ( base, orig_field);
- DEBUG_L("base_field:\n");
+
+ DEBUG_L("base_field: %p\n", base_field);
+ DEBUG_L("base_field: ");
DEBUG_F(print_generic_expr, stderr, base_field, (dump_flags_t)-1);
+ DEBUG("\n");
+
tree base_field_type = TREE_TYPE( base_field);
tree field_val_temp =
make_temp_ssa_name( field_type, NULL, "field_val_temp");
tree inner_op = TREE_OPERAND( ro_side, 0);
- //DEBUG_L("EXPT: ");
- //DEBUG_F( print_generic_expr, stderr, inner_op, (dump_flags_t)-1);
- //DEBUG("\n");
+ DEBUG_L("inner_op: ");
+ DEBUG_F( print_generic_expr, stderr, inner_op, (dump_flags_t)-1);
+ DEBUG("\n");
- // ?? why is this here
- tree rhs_ass = build3 ( COMPONENT_REF,
- ptr_type_node,
- base,
- base_field,
- NULL_TREE);
-
// For either case generate common code:
// field_array = _base.f
tree field_arry_addr =
- make_temp_ssa_name( field_type, NULL, "field_arry_addr");
+ make_temp_ssa_name( base_field_type, NULL, "field_arry_addr");
tree rhs_faa = build3 ( COMPONENT_REF,
base_field_type,
base,
@@ -247,7 +256,7 @@ str_reorg_instance_interleave_trans ( Info *info)
NULL_TREE);
gimple *get_field_arry_addr =
gimple_build_assign( field_arry_addr, rhs_faa);
-
+
// index = a
tree index =
make_temp_ssa_name( ri->pointer_rep, NULL, "index");
@@ -256,6 +265,18 @@ str_reorg_instance_interleave_trans ( Info *info)
gimple *temp_set;
gimple *final_set;
+
+ // offset = index * size_of_field
+ tree size_of_field = TYPE_SIZE_UNIT ( base_field_type);
+ tree offset = make_temp_ssa_name( sizetype, NULL, "offset"); // TBD sizetype ???
+ gimple *get_offset = gimple_build_assign ( offset, MULT_EXPR, index, size_of_field);
+
+ // field_addr = field_array + offset
+ tree field_addr =
+ make_temp_ssa_name( field_type, NULL, "field_addr");
+ gimple *get_field_addr =
+ gimple_build_assign ( field_addr, PLUS_EXPR, field_arry_addr, offset);
+
if ( ro_on_left )
{
// With: a->f = rhs
@@ -264,34 +285,59 @@ str_reorg_instance_interleave_trans ( Info *info)
// temp = rhs
temp_set = gimple_build_assign( field_val_temp, rhs);
- // field_array[index] = temp
- tree elem_to_set =
- build4 ( ARRAY_REF, field_type, field_arry_addr, index,
- NULL_TREE, NULL_TREE);
+ //// field_array[index] = temp
+ //tree elem_to_set =
+ // build4 ( ARRAY_REF, field_type, field_arry_addr, index,
+ // NULL_TREE, NULL_TREE);
+ //final_set =
+ // gimple_build_assign( elem_to_set, field_val_temp);
+
+ // *field_addr = temp
+ tree lhs_ref = build1 ( MEM_REF, field_type, field_addr);
final_set =
- gimple_build_assign( elem_to_set, field_val_temp);
+ gimple_build_assign( lhs_ref, field_val_temp);
}
else
{
// With: lhs = a->f
// Generate:
- // temp = field_array[index]
- tree elem_to_get =
- build4 ( ARRAY_REF, field_type, field_arry_addr, index,
- NULL_TREE, NULL_TREE);
+ //// temp = field_array[index]
+ //tree elem_to_get =
+ // build4 ( ARRAY_REF, field_type, field_arry_addr, index,
+ // NULL_TREE, NULL_TREE);
+ //temp_set =
+ // gimple_build_assign( field_val_temp, elem_to_get);
+
+
+ // temp = *field_addr
+ tree rhs_ref = build1 ( INDIRECT_REF, field_type, field_addr);
temp_set =
- gimple_build_assign( field_val_temp, elem_to_get);
+ gimple_build_assign( field_val_temp, rhs_ref);
// lhs = temp
final_set = gimple_build_assign( lhs, field_val_temp);
}
- // Note, since we are adding gimple in reverse
- // execution order, do it here.
- gsi_insert_before( &gsi, final_set, GSI_SAME_STMT);
- gsi_insert_before( &gsi, temp_set, GSI_SAME_STMT);
- gsi_insert_before( &gsi, get_index, GSI_SAME_STMT);
+
gsi_insert_before( &gsi, get_field_arry_addr, GSI_SAME_STMT);
+ gsi_insert_before( &gsi, get_index, GSI_SAME_STMT);
+ gsi_insert_before( &gsi, get_offset, GSI_SAME_STMT);
+ gsi_insert_before( &gsi, get_field_addr, GSI_SAME_STMT);
+ gsi_insert_before( &gsi, temp_set, GSI_SAME_STMT);
+ gsi_insert_before( &gsi, final_set, GSI_SAME_STMT);
+
+ DEBUG_L("get_field_arry_addr: ");
+ DEBUG_F( print_gimple_stmt, stderr, get_field_arry_addr, 0);
+ DEBUG("\n");
+ DEBUG_L("get_index: ");
+ DEBUG_F( print_gimple_stmt, stderr, get_index, 0);
+ DEBUG("\n");
+ DEBUG_L("temp_set: ");
+ DEBUG_F( print_gimple_stmt, stderr, temp_set, 0);
+ DEBUG("\n");
+ DEBUG_L("final_set: ");
+ DEBUG_F( print_gimple_stmt, stderr, final_set, 0);
+ DEBUG("\n");
//delete stmt
@@ -1138,31 +1184,6 @@ create_a_new_type ( Info_t *info, tree type)
}
}
- // Moved it
- #if 0
- // Create the base element for a reorg type. This is for the single
- // pool case only.
- tree base_var =
- build_decl ( UNKNOWN_LOCATION, VAR_DECL, NULL_TREE, ri->reorg_ver_type);
-
- const char *base_type_name =
- identifier_to_locale ( IDENTIFIER_POINTER ( TYPE_NAME ( ri->gcc_type)));
- size_t tlen = strlen ( REORG_SP_PREFIX) + strlen ( base_type_name);
- char *base_name = ( char*)alloca ( tlen + 1);
- strcpy ( base_name, REORG_SP_PREFIX);
- DECL_NAME ( base_var) = get_identifier ( base_name);
-
- strcat ( base_name, base_type_name);
- TREE_STATIC ( base_var) = 1;
- TREE_ADDRESSABLE ( base_var) = 1;
- DECL_NONALIASED ( base_var) = 1;
- SET_DECL_ALIGN ( base_var, TYPE_ALIGN ( ri->reorg_ver_type));
-
- varpool_node::finalize_decl ( base_var);
-
- ri->instance_interleave.base = base_var;
- #endif
-
// Mark the type as processed
( *( info->struct_types)) [ type] = { true, layout_changed};
}
@@ -1170,5 +1191,21 @@ create_a_new_type ( Info_t *info, tree type)
static tree
find_coresponding_field ( tree base_decl, tree field)
{
-
+ tree reorg_field;
+ for ( reorg_field = TYPE_FIELDS ( TREE_TYPE ( base_decl));
+ reorg_field;
+ reorg_field = DECL_CHAIN ( reorg_field))
+ {
+ const char *reorg_field_name =
+ lang_hooks.decl_printable_name ( reorg_field, 2);
+ const char *field_name =
+ lang_hooks.decl_printable_name ( field, 2);
+ //DEBUG_L("LOOK %s, %s\n", reorg_field_name, field_name);
+
+ if ( strcmp ( reorg_field_name, field_name) == 0 )
+ {
+ return reorg_field;
+ }
+ }
+ internal_error ( "find_coresponding_field: found no field");
}