From 9fc5947fa6f607c58d8d6201a42055393ab54b02 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 29 Aug 2025 14:31:47 +0300 Subject: [PATCH] core/vdbe: Micro-optimize "zero_or_null" opcode It's a hot instruction for TPC-H, for example, so worth optimizing. Reduces op_zero_or_null() from 5.6% to 2.4% in CPU flamegraph for TCP-H Q1. --- core/vdbe/execute.rs | 4 +--- core/vdbe/mod.rs | 7 +++++++ 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/core/vdbe/execute.rs b/core/vdbe/execute.rs index 2bb42fbce..211164b25 100644 --- a/core/vdbe/execute.rs +++ b/core/vdbe/execute.rs @@ -6667,9 +6667,7 @@ pub fn op_zero_or_null( mv_store: Option<&Arc>, ) -> Result { load_insn!(ZeroOrNull { rg1, rg2, dest }, insn); - if *state.registers[*rg1].get_value() == Value::Null - || *state.registers[*rg2].get_value() == Value::Null - { + if state.registers[*rg1].is_null() || state.registers[*rg2].is_null() { state.registers[*dest] = Register::Value(Value::Null) } else { state.registers[*dest] = Register::Value(Value::Integer(0)); diff --git a/core/vdbe/mod.rs b/core/vdbe/mod.rs index 1cdd2fb69..141158d3b 100644 --- a/core/vdbe/mod.rs +++ b/core/vdbe/mod.rs @@ -229,6 +229,13 @@ pub enum Register { Record(ImmutableRecord), } +impl Register { + #[inline] + pub fn is_null(&self) -> bool { + matches!(self, Register::Value(Value::Null)) + } +} + /// A row is a the list of registers that hold the values for a filtered row. This row is a pointer, therefore /// after stepping again, row will be invalidated to be sure it doesn't point to somewhere unexpected. #[derive(Debug)]