Sema: fix performance regression

LLVM fails to notice that in release builds, `logFn` ignores its
arguments, so their computation can be elided. So, LLVM fails to elide
this hashmap lookup. Its cost isn't too significant, but doing it in the
hottest loop in Sema adds up!

Technically, we could do the lookup a single time, before the loop, but
it was cleanest (and a little faster) to just disable this log call at
comptime when debug logging is disabled.
This commit is contained in:
mlugg 2024-06-20 08:38:23 +01:00
parent 6a8cf25a8a
commit 2b677d1660
No known key found for this signature in database
GPG Key ID: 3F5B7DCCBF4AF02E

View File

@ -992,11 +992,16 @@ fn analyzeBodyInner(
while (true) {
crash_info.setBodyIndex(i);
const inst = body[i];
// The hashmap lookup in here is a little expensive, and LLVM fails to optimize it away.
if (build_options.enable_logging) {
std.log.scoped(.sema_zir).debug("sema ZIR {s} %{d}", .{ sub_file_path: {
const path_digest = block.src_base_inst.resolveFull(&mod.intern_pool).path_digest;
const index = mod.path_digest_map.getIndex(path_digest).?;
break :sub_file_path mod.import_table.values()[index].sub_file_path;
}, inst });
}
const air_inst: Air.Inst.Ref = switch (tags[@intFromEnum(inst)]) {
// zig fmt: off
.alloc => try sema.zirAlloc(block, inst),