zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 40764650afd47f2ca2d191ed4d910f680702e014 (tree)
parent b9e896d7b076e59d6f6dd9b0bad9697875d1f6e4
Author: Andrew Kelley <andrew@ziglang.org>
Date:   Sat, 10 Jul 2021 15:27:33 -0700

stage1: avoid wasting padding with IR instruction tag

For stage1 ZIR instructions and stage1 AIR instructions, the instruction
op code was taking up 8 bytes due to padding even though it only needed
1 byte. This commit reduces the ref_count field from uint32_t to
uint16_t because the code only really cares if instructions are
referenced at all, not how many times they are referenced. With the
ref_count field reduced to uint16_t the uint8_t op code is now placed in
the freed up space.

Empirically, this saves 382 MiB of peak RAM usage when building the
self-hosted compiler, which is a reduction of 5%. Consequently this
resulted in a 3% reduction of cache-misses when building the self-hosted
compiler.

This was @SpexGuy's idea, committed by me because we tested it on my
computer.

Diffstat:
Msrc/stage1/all_types.hpp | 11+++++------
1 file changed, 5 insertions(+), 6 deletions(-)

diff --git a/src/stage1/all_types.hpp b/src/stage1/all_types.hpp @@ -2475,7 +2475,7 @@ struct IrBasicBlockGen { // Src instructions are generated by ir_gen_* functions in ir.cpp from AST. // ir_analyze_* functions consume Src instructions and produce Gen instructions. // Src instructions do not have type information; Gen instructions do. -enum IrInstSrcId { +enum IrInstSrcId : uint8_t { IrInstSrcIdInvalid, IrInstSrcIdDeclVar, IrInstSrcIdBr, @@ -2620,7 +2620,7 @@ enum IrInstSrcId { // ir_render_* functions in codegen.cpp consume Gen instructions and produce LLVM IR. // Src instructions do not have type information; Gen instructions do. -enum IrInstGenId { +enum IrInstGenId : uint8_t { IrInstGenIdInvalid, IrInstGenIdDeclVar, IrInstGenIdBr, @@ -2714,14 +2714,13 @@ enum IrInstGenId { }; struct IrInstSrc { - uint32_t ref_count; + IrInstSrcId id; + uint16_t ref_count; uint32_t debug_id; Scope *scope; AstNode *source_node; - IrInstSrcId id; - // When analyzing IR, instructions that point to this instruction in the "old ir" // can find the instruction that corresponds to this value in the "new ir" // with this child field. @@ -2737,7 +2736,7 @@ struct IrInstGen { IrInstGenId id; // if ref_count is zero and the instruction has no side effects, // the instruction can be omitted in codegen - uint32_t ref_count; + uint16_t ref_count; uint32_t debug_id; Scope *scope;