diff options
author | Gary Oblock <gary@amperecomputing.com> | 2020-06-19 21:09:36 -0700 |
---|---|---|
committer | Gary Oblock <gary@amperecomputing.com> | 2020-06-19 21:09:36 -0700 |
commit | 134a05537af83c3b04b36a7eebacbce6b05487db (patch) | |
tree | 5660547f77da0043b68b3bbf194d27d2fd85949d | |
parent | 35e226d2866a18045a97942b03ca593901f7a79b (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.c | 155 |
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"); } |