aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-05-13 16:48:24 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-05-13 16:50:27 -0700
commite83cf6a4542b34e7fd64028a3b1b89dacdc2e166 (patch)
treeed192b102e4ca13145623216b0e808d7f1fd6059
parentb109daacddf54dbe4ffcbef9041443f2759511e3 (diff)
downloadzig-e83cf6a4542b34e7fd64028a3b1b89dacdc2e166.tar.gz
zig-e83cf6a4542b34e7fd64028a3b1b89dacdc2e166.zip
Sema: detect and skip over elided instructions
It would be better if AstGen would actually omit these instructions rather than only marking them as elided, but that can be solved separately.
-rw-r--r--BRANCH_TODO2
-rw-r--r--src/Sema.zig5
-rw-r--r--src/Zir.zig2
3 files changed, 9 insertions, 0 deletions
diff --git a/BRANCH_TODO b/BRANCH_TODO
index c1e94369b3..1f27224f80 100644
--- a/BRANCH_TODO
+++ b/BRANCH_TODO
@@ -65,3 +65,5 @@
* in SwitchProng resolve, make sure AST tree gets loaded.
It will be unloaded if using cached ZIR.
+
+ * make AstGen smart enough to omit elided store_to_block_ptr instructions
diff --git a/src/Sema.zig b/src/Sema.zig
index 626624110e..895ac84dd0 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -1461,6 +1461,11 @@ fn zirStoreToBlockPtr(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) In
defer tracy.end();
const bin_inst = sema.code.instructions.items(.data)[inst].bin;
+ if (bin_inst.lhs == .none) {
+ // This is an elided instruction, but AstGen was not smart enough
+ // to omit it.
+ return;
+ }
const ptr = try sema.resolveInst(bin_inst.lhs);
const value = try sema.resolveInst(bin_inst.rhs);
const ptr_ty = try sema.mod.simplePtrType(sema.arena, value.ty, true, .One);
diff --git a/src/Zir.zig b/src/Zir.zig
index 274098fa28..73f8e3e43b 100644
--- a/src/Zir.zig
+++ b/src/Zir.zig
@@ -484,6 +484,8 @@ pub const Inst = struct {
/// Same as `store` but the type of the value being stored will be used to infer
/// the block type. The LHS is the pointer to store to.
/// Uses the `bin` union field.
+ /// If the pointer is none, it means this instruction has been elided in
+ /// AstGen, but AstGen was unable to actually omit it from the ZIR code.
store_to_block_ptr,
/// Same as `store` but the type of the value being stored will be used to infer
/// the pointer type.