From 7509cdceb83dbbeb69b1b85b956cf45a62959b26 Mon Sep 17 00:00:00 2001 From: Ginger Bill Date: Sat, 10 Sep 2016 11:24:50 +0100 Subject: Default struct member reordering for minimal size Rule: largest members to smallest; if same size, order in source order --- src/codegen/ssa.cpp | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'src/codegen/ssa.cpp') diff --git a/src/codegen/ssa.cpp b/src/codegen/ssa.cpp index 3568504e4..8ccdeb9a1 100644 --- a/src/codegen/ssa.cpp +++ b/src/codegen/ssa.cpp @@ -1875,26 +1875,29 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue auto *st = &base_type->Record; if (cl->elems != NULL && gb_array_count(cl->elems) > 0) { gb_for_array(field_index, cl->elems) { - AstNode *elem = cl->elems[field_index]; + isize index = field_index; + AstNode *elem = cl->elems[index]; ssaValue *field_expr = NULL; Entity *field = NULL; if (elem->kind == AstNode_FieldValue) { ast_node(kv, FieldValue, elem); Selection sel = lookup_field(base_type, kv->field->Ident.string, false); - field_index = sel.index[0]; + index = sel.index[0]; field_expr = ssa_build_expr(proc, kv->value); } else { + Selection sel = lookup_field(base_type, st->fields_in_src_order[field_index]->token.string, false); + index = sel.index[0]; field_expr = ssa_build_expr(proc, elem); } GB_ASSERT(ssa_type(field_expr)->kind != Type_Tuple); - field = st->fields[field_index]; + field = st->fields[index]; Type *ft = field->type; ssaValue *fv = ssa_emit_conv(proc, field_expr, ft); - ssaValue *gep = ssa_emit_struct_gep(proc, v, field_index, ft); + ssaValue *gep = ssa_emit_struct_gep(proc, v, index, ft); ssa_emit_store(proc, gep, fv); } } -- cgit v1.2.3