Sema: avoid emitting sequential dbg_stmt instructions

Often, a `dbg_stmt` ends up being associated with no real code because
whatever it referred to was eliminated by semantic analysis. In these
cases, Sema can replace the last `dbg_stmt` with the new one to avoid
redundant AIR instructions which at best are nops and at worst cause
backends to emit useless info (e.g. CBE does this).
This commit is contained in:
mlugg 2023-04-26 01:43:55 +01:00
parent 2e23ddbe7b
commit 3df2f356eb
No known key found for this signature in database
GPG Key ID: 58978E823BDE3EF9

View File

@ -5852,6 +5852,19 @@ fn zirDbgStmt(sema: *Sema, block: *Block, inst: Zir.Inst.Index) CompileError!voi
if (block.is_comptime or sema.mod.comp.bin_file.options.strip) return;
const inst_data = sema.code.instructions.items(.data)[inst].dbg_stmt;
if (block.instructions.items.len != 0) {
const idx = block.instructions.items[block.instructions.items.len - 1];
if (sema.air_instructions.items(.tag)[idx] == .dbg_stmt) {
// The previous dbg_stmt didn't correspond to any actual code, so replace it.
sema.air_instructions.items(.data)[idx].dbg_stmt = .{
.line = inst_data.line,
.column = inst_data.column,
};
return;
}
}
_ = try block.addInst(.{
.tag = .dbg_stmt,
.data = .{ .dbg_stmt = .{