Commit 3df2f356eb

mlugg <mlugg@mlugg.co.uk>
2023-04-26 02:43:55
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).
1 parent 2e23ddb
Changed files (1)
src/Sema.zig
@@ -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 = .{