Commit 40764650af

Andrew Kelley <andrew@ziglang.org>
2021-07-11 00:27:33
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.
1 parent b9e896d
Changed files (1)
src
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;