diff --git a/crates/nu-engine/src/eval_ir.rs b/crates/nu-engine/src/eval_ir.rs index 03a00ca768..a461954ee8 100644 --- a/crates/nu-engine/src/eval_ir.rs +++ b/crates/nu-engine/src/eval_ir.rs @@ -20,24 +20,19 @@ pub fn eval_ir_block( // Allocate required space for registers. We prefer to allocate on the stack, but will // allocate on the heap if it's over the compiled maximum size + // + // Keep in mind that there is some code generated for each variant; at least at the moment + // it doesn't seem like LLVM is able to optimize this away let result = match ir_block.register_count { - 0 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 1 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 2 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 3 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 4 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 5 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 6 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 7 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 8 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 9 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 10 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 11 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 12 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 13 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 14 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 15 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), - 16 => eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input), + c if c <= 4 => { + eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input) + } + c if c <= 8 => { + eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input) + } + c if c <= 16 => { + eval_ir_block_static::(engine_state, stack, &block_span, ir_block, input) + } _ => eval_ir_block_dynamic::(engine_state, stack, &block_span, ir_block, input), }; @@ -64,7 +59,11 @@ fn eval_ir_block_static( ir_block: &IrBlock, input: PipelineData, ) -> Result { - log::trace!("entering block with {} registers on stack", N); + log::trace!( + "entering block with {} registers on stack ({} requested)", + N, + ir_block.register_count + ); const EMPTY: PipelineData = PipelineData::Empty; let mut array = [EMPTY; N]; let mut ctx = EvalContext {