I'm somehow misusing GIMPLE (probably in multiple ways) and I need some help in straightening out this little mess I've made.
I'm trying to do the following: In an attempt at structure reorganization (instance interleaving) an array of structures is being transformed into a structure of arrays. for the simple example I'm using typedef struct type type_t; struct type { double x; double y; }; . . type_t *data = (type_t *)malloc( len * sizeof(type_t)); . . result = data[i].y; Is transformed into this or something close to it typedef long _reorg_SP_ptr_type_type_t typedef struct _reorg_base_type_type_t _reorg_base_type_type_t struct _reorg_base_type_type_t { double *x; double *y; }; _reorg_SP_ptr_type_type_t data; _reorg_base_type_type_t _reorg_base_var_type_t; // Note I'm ignoring a bunch of stuff that needs to happen // when a malloc fails.. _reorg_base_var_type_t.x = (double*)malloc( len*sizeof(double)); _reorg_base_var_type_t.y = (double*)malloc( len*sizeof(double)); data = 0; . . double *temp = _reorg_base_var_type_t.y; result = temp[i]; Now, believe it or not the the whole bit above, except for "result = data[i].y", seems to work just fine. I attempted to do this (result = data[i].y) via basically two different ways. One is using ARRAY_REF and in the other faking an array access with INDIRECT_REF. The first approach chokes on the fact that temp is a pointer and the second dies in ssa operand scanning because it doesn't have a case for INDIRECT_REF. The code below shows both ways. What have I done wrong here and what to I need to do differently to get it to work? Thanks, Gary PS Please ignore the then case below. -------------------------------------------------------------------------------- gimple_stmt_iterator gsi = gsi_for_stmt( stmt); // Dump for debugging print_gimple_stmt ( stderr, stmt, 0); tree lhs = gimple_assign_lhs( stmt); tree rhs = gimple_assign_rhs1( stmt); bool ro_on_left = tree_contains_a_reorgtype_p ( lhs, info); tree ro_side = ro_on_left ? lhs : rhs; tree nonro_side = ro_on_left ? rhs : lhs; switch ( recognize_op ( ro_side, info) ) // "a->f" { case ReorgOpT_Indirect: { tree orig_field = TREE_OPERAND( ro_side, 1); tree field_type = TREE_TYPE( orig_field); tree base = ri->instance_interleave.base; tree base_field = find_coresponding_field ( base, orig_field); 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); // For either case generate common code: // field_array = _base.f tree field_arry_addr = make_temp_ssa_name( base_field_type, NULL, "field_arry_addr"); tree rhs_faa = build3 ( COMPONENT_REF, //base_field_type, // This doesn't work ptr_type_node, // This seems bogus base, //base_field, // This doesn't work orig_field, // This seems bogus NULL_TREE); // Use this to access the array of element. 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"); gimple *get_index = gimple_build_assign( index, inner_op); gimple *temp_set; gimple *final_set; #if WITH_INDIRECT // offset = index * size_of_field tree size_of_field = TYPE_SIZE_UNIT ( base_field_type); tree offset = make_temp_ssa_name( sizetype, NULL, "offset"); gimple *get_offset = gimple_build_assign ( offset, MULT_EXPR, index, size_of_field); // field_addr = field_array + offset // bug fix here (TBD) type must be *double not double tree field_addr = make_temp_ssa_name( base_field_type, NULL, "field_addr"); gimple *get_field_addr = gimple_build_assign ( field_addr, PLUS_EXPR, field_arry_addr, offset); #endif if ( ro_on_left ) { // With: a->f = rhs // Generate: // temp = rhs temp_set = gimple_build_assign( field_val_temp, rhs); #if WITH_INDIRECT // NOTE, THIS (MEM_REF) SHOULD NOT WORK (IGNORE THIS PLEASE!) // not tested yet! I know THIS bit won't work. // *field_addr = temp tree lhs_ref = build1 ( MEM_REF, field_type, field_addr); #else // field_arry_addr[index] tree lhs_ref = build4 ( ARRAY_REF, field_type, field_arry_addr, index, NULL_TREE, NULL_TREE); #endif // lhs = temp final_set = gimple_build_assign( lhs_ref, field_val_temp); } else { // With: lhs = a->f // Generate: // temp = *field_addr #if WITH_INDIRECT // I tried MEM_REF here and build1 had an internal error tree rhs_ref = build1 ( INDIRECT_REF, field_type, field_addr); #else tree rhs_ref = build4 ( ARRAY_REF, field_type, field_arry_addr, index, NULL_TREE, NULL_TREE); #endif temp_set = gimple_build_assign( field_val_temp, rhs_ref); // lhs = temp final_set = gimple_build_assign( lhs, field_val_temp); } // Dump for debugging print_gimple_stmt ( stderr, get_field_arry_addr, 0); print_gimple_stmt ( stderr, get_index, 0); #if WITH_INDIRECT print_gimple_stmt ( stderr, get_offset, 0); print_gimple_stmt ( stderr, get_field_addr, 0); #endif print_gimple_stmt ( stderr, temp_set, 0); print_gimple_stmt ( stderr, final_set, 0); gsi_insert_before( &gsi, get_field_arry_addr, GSI_SAME_STMT); gsi_insert_before( &gsi, get_index, GSI_SAME_STMT); #if WITH_INDIRECT gsi_insert_before( &gsi, get_offset, GSI_SAME_STMT); gsi_insert_before( &gsi, get_field_addr, GSI_SAME_STMT); #endif gsi_insert_before( &gsi, temp_set, GSI_SAME_STMT); // << malformed??? gsi_insert_before( &gsi, final_set, GSI_SAME_STMT); //delete stmt gsi_remove ( &gsi, true); } // end ReorgOpT_Indirect case break; } // end ReorgOpT_Indirect case case ReorgOpT_AryDir: // "x[i].f" // Not implemented in single pool internal_error ( "ReorgOpT_AryDir not possible"); default: internal_error ( "Reached operand default for ReorgOpT_Indirect"); } CONFIDENTIALITY NOTICE: This e-mail message, including any attachments, is for the sole use of the intended recipient(s) and contains information that is confidential and proprietary to Ampere Computing or its subsidiaries. It is to be used solely for the purpose of furthering the parties' business relationship. Any review, copying, or distribution of this email (or any attachments thereto) is strictly prohibited. If you are not the intended recipient, please contact the sender immediately and permanently delete the original and any copies of this email and any attachments thereto.