aboutsummaryrefslogtreecommitdiff
path: root/src/codegen/ssa.cpp
diff options
context:
space:
mode:
authorGinger Bill <bill@gingerbill.org>2016-09-10 11:24:50 +0100
committerGinger Bill <bill@gingerbill.org>2016-09-10 11:24:50 +0100
commit7509cdceb83dbbeb69b1b85b956cf45a62959b26 (patch)
treeebed5cfd541b87f06db0f46fb1cc68c8e93ea4dd /src/codegen/ssa.cpp
parent6979678ff947cecc8e6e0d0e8ceea7e0304d3f4e (diff)
Default struct member reordering for minimal size
Rule: largest members to smallest; if same size, order in source order
Diffstat (limited to 'src/codegen/ssa.cpp')
-rw-r--r--src/codegen/ssa.cpp11
1 files changed, 7 insertions, 4 deletions
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);
}
}