From 2b677d1660018434757f9c9efec3c712675e6c47 Mon Sep 17 00:00:00 2001 From: mlugg Date: Thu, 20 Jun 2024 08:38:23 +0100 Subject: [PATCH] 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. --- src/Sema.zig | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/Sema.zig b/src/Sema.zig index c34004e200..a5c94eb57c 100644 --- a/src/Sema.zig +++ b/src/Sema.zig @@ -992,11 +992,16 @@ fn analyzeBodyInner( while (true) { crash_info.setBodyIndex(i); const inst = body[i]; - 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 }); + + // 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),