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.
This commit is contained in:
Andrew Kelley
2021-05-13 16:48:24 -07:00
parent b109daacdd
commit e83cf6a454
3 changed files with 9 additions and 0 deletions

View File

@@ -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

View File

@@ -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);

View File

@@ -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.