diff options
author | Gary Oblock <gary@amperecomputing.com> | 2020-06-10 20:05:49 -0700 |
---|---|---|
committer | Gary Oblock <gary@amperecomputing.com> | 2020-06-10 20:05:49 -0700 |
commit | 8d37b300d1849ca8c35e2f5c50c0fafc952ec2ae (patch) | |
tree | 4be74c35c342043154dd1bcb025fb5a259bb5304 /gcc/ipa-str-reorg-instance-interleave.c | |
parent | 0e3acbe69c82973e886682c25531ecc05a29e71f (diff) |
debugging of malloc and interface nicities
Diffstat (limited to 'gcc/ipa-str-reorg-instance-interleave.c')
-rw-r--r-- | gcc/ipa-str-reorg-instance-interleave.c | 459 |
1 files changed, 231 insertions, 228 deletions
diff --git a/gcc/ipa-str-reorg-instance-interleave.c b/gcc/ipa-str-reorg-instance-interleave.c index d2eaa0fa4c7..d14b51abe66 100644 --- a/gcc/ipa-str-reorg-instance-interleave.c +++ b/gcc/ipa-str-reorg-instance-interleave.c @@ -291,240 +291,243 @@ str_reorg_instance_interleave_trans ( Info *info) // Not needed for single pool. break; case ReorgT_Malloc: - #if 0 - DEBUG_L("Transform ReorgT_Malloc\n"); - INDENT(2); - // Note, unlike other simpler transformations, - // this must build new basic blocks to add new - // gimple to and use a phi for the final result. - // See appendix on malloc transformation for - // each comment starting with "FROM." - ReorgType_t *ri = contains_a_reorgtype( stmt, info); - // FROM len = val/size - tree arg = gimple_call_arg( stmt, 0); - // TBD: len is new SSA - tree val = gimple_call_lhs( stmt); - gcc_assert( TREE_CODE( TREE_TYPE(val)) == INDIRECT_REF); - tree size = TYPE_SIZE_UNIT( TREE_TYPE( TREE_TYPE( val))); - // FROM len = val/size (insert before stmt) <== maybe arg/size - tree len = - make_temp_ssa_name( sizetype, NULL, "fail_val"); - gimple_stmt_iterator gsi = gsi_for_stmt( stmt); - //gimple *glen = - // gimple_build_assign ( len, TRUNC_DIV_EXPR, val, size); - gimple *glen = - gimple_build_assign ( len, TRUNC_DIV_EXPR, arg, size); - gsi_insert_before( &gsi, glen, GSI_SAME_STMT); - // Note in other places in this doc this would - // be "insert glen before stmt" instead of this but - // here we need to create new basic blocks. - // FROM edge = split this block after stmt - edge new_edge = split_block ( bb, stmt); - // FROM before_bb = edge->src // same as this bb - basic_block before_bb = new_edge->src; // - // FROM after_bb = edge->dest - basic_block after_bb = new_edge->dest; - // FROM delete edge - remove_edge ( new_edge); - // FROM prev_bb = before_bb - basic_block prev_bb = before_bb; - // FROM prev_ok_field is new label - tree prev_ok_field_L = - create_artificial_label ( UNKNOWN_LOCATION); - // FROM after_label is new label - tree after_label_L = - create_artificial_label ( UNKNOWN_LOCATION); - // FROM add goto for prev_ok_field to end of before_bb - gimple *goto_pof = gimple_build_goto ( prev_ok_field_L); - gsi_insert_before ( &gsi, goto_pof, GSI_SAME_STMT); // TBD insert after??? - // FROM failure_bb = create_empty_block(prev_bb) - basic_block failure_bb = create_empty_bb ( prev_bb); - // FROM make_edge( failure_bb, after_bb, EDGE_FALLTHRU); - edge failure_edge = make_edge ( failure_bb, - after_bb, EDGE_FALLTHRU); - // FROM bad_field is new label - tree bad_field_L = - create_artificial_label ( UNKNOWN_LOCATION); - // FROM delete stmt - gsi_remove ( &gsi, true); - - // code in failure_bb - // - // FROM fail_val is new SSA - tree return_type = TREE_TYPE ( arg); - tree fail_val = - make_temp_ssa_name ( return_type, NULL, "fail_val"); + #if 1 + { + DEBUG_L("Transform ReorgT_Malloc\n"); + INDENT(2); + // Note, unlike other simpler transformations, + // this must build new basic blocks to add new + // gimple to and use a phi for the final result. + // See appendix on malloc transformation for + // each comment starting with "FROM." + ReorgType_t *ri = contains_a_reorgtype( stmt, info); + // FROM len = val/size + tree arg = gimple_call_arg( stmt, 0); + // TBD: len is new SSA + tree val = gimple_call_lhs( stmt); + gcc_assert( TREE_CODE( TREE_TYPE(val)) == INDIRECT_REF); + tree size = TYPE_SIZE_UNIT( TREE_TYPE( TREE_TYPE( val))); + // FROM len = val/size (insert before stmt) <== maybe arg/size + tree len = + make_temp_ssa_name( sizetype, NULL, "fail_val"); + gimple_stmt_iterator gsi = gsi_for_stmt( stmt); + //gimple *glen = + // gimple_build_assign ( len, TRUNC_DIV_EXPR, val, size); + gimple *glen = + gimple_build_assign ( len, TRUNC_DIV_EXPR, arg, size); + gsi_insert_before( &gsi, glen, GSI_SAME_STMT); + // Note in other places in this doc this would + // be "insert glen before stmt" instead of this but + // here we need to create new basic blocks. + // FROM edge = split this block after stmt + edge new_edge = split_block ( bb, stmt); + // FROM before_bb = edge->src // same as this bb + basic_block before_bb = new_edge->src; // + // FROM after_bb = edge->dest + basic_block after_bb = new_edge->dest; + // FROM delete edge + remove_edge ( new_edge); + // FROM prev_bb = before_bb + basic_block prev_bb = before_bb; + // FROM prev_ok_field is new label + tree prev_ok_field_L = + create_artificial_label ( UNKNOWN_LOCATION); + // FROM after_label is new label + tree after_label_L = + create_artificial_label ( UNKNOWN_LOCATION); + // FROM add goto for prev_ok_field to end of before_bb + gimple *goto_pof = gimple_build_goto ( prev_ok_field_L); + gsi_insert_before ( &gsi, goto_pof, GSI_SAME_STMT); // TBD insert after??? + // FROM failure_bb = create_empty_block(prev_bb) + basic_block failure_bb = create_empty_bb ( prev_bb); + // FROM make_edge( failure_bb, after_bb, EDGE_FALLTHRU); + edge failure_edge = make_edge ( failure_bb, + after_bb, EDGE_FALLTHRU); + // FROM bad_field is new label + tree bad_field_L = + create_artificial_label ( UNKNOWN_LOCATION); + // FROM delete stmt + gsi_remove ( &gsi, true); + + // code in failure_bb + // + // FROM fail_val is new SSA + tree return_type = TREE_TYPE ( arg); + tree fail_val = + make_temp_ssa_name ( return_type, NULL, "fail_val"); // FROM gsi = gsi_start_bb ( failure_bb) - gsi = gsi_start_bb ( failure_bb); - // FROM gsi_insert_after ( &gsi, "goto after_label") - gimple *goto_al = gimple_build_goto ( after_label_L); - gsi_insert_after ( &gsi, goto_al, GSI_SAME_STMT); - // (per field) { - tree field; - tree reorg_type = ri->gcc_type; // is this useful here? - tree reorg_pointer_type = ri->pointer_rep; - tree fndecl_free = builtin_decl_explicit( BUILT_IN_FREE); - tree base = ri->clone; - for( field = TYPE_FIELDS( reorg_type); - field; - field = DECL_CHAIN( field)) { - // FROM gsi_insert_after( &gsi, "base.field = 0") - tree lhs_ass = - build3( COMPONENT_REF, ptr_type_node, base, field, NULL_TREE); - gimple *gzero = gimple_build_assign( lhs_ass, null_pointer_node); - gsi_insert_after( &gsi, gzero, GSI_SAME_STMT); - - // FROM gsi_insert_after( &gsi, "free(field)") - // TBD -- I'm - tree to_free = - make_temp_ssa_name( reorg_pointer_type, NULL, "to_free"); - gcall *free_call = gimple_build_call( fndecl_free, 1, to_free); - gsi_insert_after( &gsi, free_call, GSI_SAME_STMT); - tree rhs_ass = - build3( COMPONENT_REF, ptr_type_node, base, field, NULL_TREE); - gimple *gaddr2free = gimple_build_assign( to_free, rhs_ass); - gsi_insert_after( &gsi, gaddr2free, GSI_SAME_STMT); - } - // FROM gsi_insert_after( &gsi, "fail_val = minint") - gimple *gretnull = - gimple_build_assign ( fail_val, - build_int_cst ( size_type_node, - TYPE_MIN_VALUE ( TREE_TYPE ( fail_val)))); - gsi_insert_after( &gsi, gretnull, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, bad_field ) - gimple *gbad_field = gimple_build_label( bad_field_L); - gsi_insert_after( &gsi, gbad_field, GSI_SAME_STMT); - - // loop setup trickery for gimple idioms - // - // FROM prev_order = failure_bb - basic_block prev_order = failure_bb; - // FROM prev_bb = before_bb - prev_bb = before_bb; - - // Generate all the real allocation code - tree fndecl_malloc = builtin_decl_explicit( BUILT_IN_MALLOC); - // This, after the following loop, will hold the start of the - // field related code. - tree new_ok_field_L; - - // FROM (for fields) { - for( field = TYPE_FIELDS( reorg_type); - field; - field = DECL_CHAIN( field)) - { - // FROM res is new SSA - // Note, alternative code would substitute ptr_type_node - // for null_pointer_node. - // This is probably a duplicate of the def of res below. - //tree res = - // make_temp_ssa_name( null_pointer_node, NULL, "res"); - // FROM new_bb = create_empty_block(prev_order); - basic_block new_bb = create_empty_bb ( prev_order); - // FROM gsi = gsi_start_bb( new_bb) - gimple_stmt_iterator gsi = gsi_start_bb ( new_bb); - // FROM set imm dom new_bb as prev_bb - set_immediate_dominator ( CDI_DOMINATORS, new_bb, prev_bb); - // FROM make_edge( prev_bb, new_bb, EDGE_TRUE_VALUE); - make_edge ( prev_bb, new_bb, EDGE_TRUE_VALUE); - // FROM make_edge( new_bb, failure_bb, EDGE_FALSE_VALUE); - make_edge ( new_bb, failure_bb, EDGE_FALSE_VALUE); - // FROM new_ok_field is new label - new_ok_field_L = - create_artificial_label ( UNKNOWN_LOCATION); - // FROM gsi_insert_after( &gsi, "if( res NE NULL ) - // goto new_ok_field; - // goto bad_field") - tree res = - make_temp_ssa_name ( ptr_type_node, NULL, "res"); - gimple *gcond = - gimple_build_cond ( NE_EXPR, res, null_pointer_node, - new_ok_field_L, bad_field_L); - gsi_insert_after ( &gsi, gcond, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, "base.field = res") + gsi = gsi_start_bb ( failure_bb); + // FROM gsi_insert_after ( &gsi, "goto after_label") + gimple *goto_al = gimple_build_goto ( after_label_L); + gsi_insert_after ( &gsi, goto_al, GSI_SAME_STMT); + // (per field) { + tree field; + tree reorg_type = ri->gcc_type; // is this useful here? + tree reorg_pointer_type = ri->pointer_rep; + tree fndecl_free = builtin_decl_explicit( BUILT_IN_FREE); + tree base = ri->clone; + for( field = TYPE_FIELDS( reorg_type); + field; + field = DECL_CHAIN( field)) { + // FROM gsi_insert_after( &gsi, "base.field = 0") tree lhs_ass = build3( COMPONENT_REF, ptr_type_node, base, field, NULL_TREE); - gimple *gset_field = gimple_build_assign( lhs_ass, res); - gsi_insert_after( &gsi, gset_field, GSI_SAME_STMT); + gimple *gzero = gimple_build_assign( lhs_ass, null_pointer_node); + gsi_insert_after( &gsi, gzero, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, "res = malloc( mem_size)") - // The alternative to sizetype are long_integer_type_node - // and integer_type_node. - tree mem_size = - make_temp_ssa_name( sizetype, NULL, "mem_size"); - gcall *malloc_call = gimple_build_call( fndecl_malloc, 1, mem_size); - gimple_call_set_lhs( malloc_call, res); - gsi_insert_after( &gsi, malloc_call, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, "mem_size = len * field_size") - //gimple *gsize = - // gimple_build_assign ( mem_size, MULT_EXPR, TYPE_SIZE(field), - // len, NULL_TREE, NULL_TREE); - gimple *gsize = - gimple_build_assign ( mem_size, - MULT_EXPR, - TYPE_SIZE ( field), - len); - gsi_insert_after( &gsi, gsize, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, prev_ok_field) - gimple *gprev_ok_field = gimple_build_label ( prev_ok_field_L); - gsi_insert_after ( &gsi, gprev_ok_field, GSI_SAME_STMT); - // FROM prev_bb = new_bb - prev_bb = new_bb; - // FROM prev_order = new_bb - prev_order = new_bb; - // FROM prev_ok_field = new_ok_field - prev_ok_field_L = new_ok_field_L; + // FROM gsi_insert_after( &gsi, "free(field)") + // TBD -- I'm + tree to_free = + make_temp_ssa_name( reorg_pointer_type, NULL, "to_free"); + gcall *free_call = gimple_build_call( fndecl_free, 1, to_free); + gsi_insert_after( &gsi, free_call, GSI_SAME_STMT); + tree rhs_ass = + build3( COMPONENT_REF, ptr_type_node, base, field, NULL_TREE); + gimple *gaddr2free = gimple_build_assign( to_free, rhs_ass); + gsi_insert_after( &gsi, gaddr2free, GSI_SAME_STMT); } + // FROM gsi_insert_after( &gsi, "fail_val = minint") + gimple *gretnull = + gimple_build_assign ( fail_val, + //build_int_cst ( size_type_node, + TYPE_MIN_VALUE ( TREE_TYPE ( fail_val))); // ); + gsi_insert_after( &gsi, gretnull, GSI_SAME_STMT); + // FROM gsi_insert_after( &gsi, bad_field ) + gimple *gbad_field = gimple_build_label( bad_field_L); + gsi_insert_after( &gsi, gbad_field, GSI_SAME_STMT); + + // loop setup trickery for gimple idioms + // + // FROM prev_order = failure_bb + basic_block prev_order = failure_bb; + // FROM prev_bb = before_bb + prev_bb = before_bb; + + // Generate all the real allocation code + tree fndecl_malloc = builtin_decl_explicit( BUILT_IN_MALLOC); + // This, after the following loop, will hold the start of the + // field related code. + tree new_ok_field_L; + + // FROM (for fields) { + for( field = TYPE_FIELDS( reorg_type); + field; + field = DECL_CHAIN( field)) + { + // FROM res is new SSA + // Note, alternative code would substitute ptr_type_node + // for null_pointer_node. + // This is probably a duplicate of the def of res below. + //tree res = + // make_temp_ssa_name( null_pointer_node, NULL, "res"); + // FROM new_bb = create_empty_block(prev_order); + basic_block new_bb = create_empty_bb ( prev_order); + // FROM gsi = gsi_start_bb( new_bb) + gimple_stmt_iterator gsi = gsi_start_bb ( new_bb); + // FROM set imm dom new_bb as prev_bb + set_immediate_dominator ( CDI_DOMINATORS, new_bb, prev_bb); + // FROM make_edge( prev_bb, new_bb, EDGE_TRUE_VALUE); + make_edge ( prev_bb, new_bb, EDGE_TRUE_VALUE); + // FROM make_edge( new_bb, failure_bb, EDGE_FALSE_VALUE); + make_edge ( new_bb, failure_bb, EDGE_FALSE_VALUE); + // FROM new_ok_field is new label + new_ok_field_L = + create_artificial_label ( UNKNOWN_LOCATION); + // FROM gsi_insert_after( &gsi, "if( res NE NULL ) + // goto new_ok_field; + // goto bad_field") + tree res = + make_temp_ssa_name ( ptr_type_node, NULL, "res"); + gimple *gcond = + gimple_build_cond ( NE_EXPR, res, null_pointer_node, + new_ok_field_L, bad_field_L); + gsi_insert_after ( &gsi, gcond, GSI_SAME_STMT); + // FROM gsi_insert_after( &gsi, "base.field = res") + tree lhs_ass = + build3( COMPONENT_REF, ptr_type_node, base, field, NULL_TREE); + gimple *gset_field = gimple_build_assign( lhs_ass, res); + gsi_insert_after( &gsi, gset_field, GSI_SAME_STMT); + + // FROM gsi_insert_after( &gsi, "res = malloc( mem_size)") + // The alternative to sizetype are long_integer_type_node + // and integer_type_node. + tree mem_size = + make_temp_ssa_name( sizetype, NULL, "mem_size"); + gcall *malloc_call = gimple_build_call( fndecl_malloc, 1, mem_size); + gimple_call_set_lhs( malloc_call, res); + gsi_insert_after( &gsi, malloc_call, GSI_SAME_STMT); + // FROM gsi_insert_after( &gsi, "mem_size = len * field_size") + //gimple *gsize = + // gimple_build_assign ( mem_size, MULT_EXPR, TYPE_SIZE(field), + // len, NULL_TREE, NULL_TREE); + gimple *gsize = + gimple_build_assign ( mem_size, + MULT_EXPR, + TYPE_SIZE ( field), + len); + gsi_insert_after( &gsi, gsize, GSI_SAME_STMT); + // FROM gsi_insert_after( &gsi, prev_ok_field) + gimple *gprev_ok_field = gimple_build_label ( prev_ok_field_L); + gsi_insert_after ( &gsi, gprev_ok_field, GSI_SAME_STMT); + // FROM prev_bb = new_bb + prev_bb = new_bb; + // FROM prev_order = new_bb + prev_order = new_bb; + // FROM prev_ok_field = new_ok_field + prev_ok_field_L = new_ok_field_L; + } + + // create basic block for success + // + // FROM success_bb = create_empty_block(prev_bb_order); + basic_block success_bb = create_empty_bb ( prev_bb); + // FROM set imm dom success_bb as prev_bb + set_immediate_dominator ( CDI_DOMINATORS, success_bb, prev_bb); + // FROM make_edge( prev_bb, success_bb, EDGE_TRUE_VALUE); + make_edge ( prev_bb, success_bb, EDGE_TRUE_VALUE); + // FROM make_edge( success_bb, after_bb, EDGE_TRUE_VALUE); + edge success_edge = make_edge ( success_bb, after_bb, EDGE_TRUE_VALUE); + + // code in success_bb + // + // FROM success_val is new SSA + tree success_val = + make_temp_ssa_name( reorg_pointer_type, NULL, "success_val"); + // FROM gsi = gsi_start_bb( failure_bb) + // Reuse the same gsi??? Or create a new one??? + //gimple_stmt_iterator gsi = gsi_start_bb ( failure_bb); + gsi = gsi_start_bb ( success_bb); // used to be failure_bb + // FROM gsi_insert_after( &gsi, "goto after_label") + // Reuse goto_al + //gimple *goto_al = gimple_build_goto( after_label_L); + goto_al = gimple_build_goto( after_label_L); + gsi_insert_after( &gsi, goto_al, GSI_SAME_STMT); + // FROM gsi_insert_after( &gsi, "success_val = 0") + gimple *set_succ = + gimple_build_assign ( success_val, + build_int_cst ( reorg_pointer_type, 0)); + gsi_insert_after( &gsi, set_succ, GSI_SAME_STMT); + // FROM gsi_insert_after( &gsi, new_ok_field ) + gimple *gnew_ok_field = gimple_build_label ( new_ok_field_L); + gsi_insert_after ( &gsi, gnew_ok_field, GSI_SAME_STMT); + + // add code to after_bb + // + // FROM gsi = gsi_start_bb( after_bb) + // Reuse gsi + //gimple_stmt_iterator gsi = gsi_start_bb( after_bb); + gsi = gsi_start_bb( after_bb); + // FROM gsi_insert_after( &gsi, "lhs = "phi(success_val, fail_val) + gphi *der_phi = create_phi_node( val, after_bb); // was lhs?? instead of val + add_phi_arg( der_phi, success_val, success_edge, UNKNOWN_LOCATION); + add_phi_arg( der_phi, fail_val, failure_edge, UNKNOWN_LOCATION); + gsi_insert_after( &gsi, der_phi, GSI_SAME_STMT); - // create basic block for success - // - // FROM success_bb = create_empty_block(prev_bb_order); - basic_block success_bb = create_empty_bb ( prev_bb); - // FROM set imm dom success_bb as prev_bb - set_immediate_dominator ( CDI_DOMINATORS, success_bb, prev_bb); - // FROM make_edge( prev_bb, success_bb, EDGE_TRUE_VALUE); - make_edge ( prev_bb, success_bb, EDGE_TRUE_VALUE); - // FROM make_edge( success_bb, after_bb, EDGE_TRUE_VALUE); - edge success_edge = make_edge ( success_bb, after_bb, EDGE_TRUE_VALUE); - - // code in success_bb - // - // FROM success_val is new SSA - tree success_val = - make_temp_ssa_name( reorg_pointer_type, NULL, "success_val"); - // FROM gsi = gsi_start_bb( failure_bb) - // Reuse the same gsi??? Or create a new one??? - //gimple_stmt_iterator gsi = gsi_start_bb ( failure_bb); - gsi = gsi_start_bb ( failure_bb); - // FROM gsi_insert_after( &gsi, "goto after_label") - // Reuse goto_al - //gimple *goto_al = gimple_build_goto( after_label_L); - goto_al = gimple_build_goto( after_label_L); - gsi_insert_after( &gsi, goto_al, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, "success_val = 0") - gimple *set_succ = - gimple_build_assign ( success_val, - build_int_cst ( reorg_pointer_type, 0)); - gsi_insert_after( &gsi, set_succ, GSI_SAME_STMT); - // FROM gsi_insert_after( &gsi, new_ok_field ) - gimple *gnew_ok_field = gimple_build_label ( new_ok_field_L); - gsi_insert_after ( &gsi, gnew_ok_field, GSI_SAME_STMT); - - // add code to after_bb - // - // FROM gsi = gsi_start_bb( after_bb) - // Reuse gsi - //gimple_stmt_iterator gsi = gsi_start_bb( after_bb); - gsi = gsi_start_bb( after_bb); - // FROM gsi_insert_after( &gsi, "lhs = "phi(success_val, fail_val) - gphi *der_phi = create_phi_node( lhs, after_bb); - add_phi_arg( der_phi, success_val, success_edge, UNKNOWN_LOCATION); - add_phi_arg( der_phi, fail_val, failure_edge, UNKNOWN_LOCATION); - - // FROM gsi_insert_after( &gsi, after_label) - gimple gafter_label = gimple_build_label( after_L); - gsi_insert_after( &gsi, gafter_label, GSI_SAME_STMT); - #endif + // FROM gsi_insert_after( &gsi, after_label) + gimple *gafter_label = gimple_build_label( after_label_L); + gsi_insert_after( &gsi, gafter_label, GSI_SAME_STMT); + } + #endif INDENT(-2); break; case ReorgT_Calloc: |