From 9cebae9b56b8953514011dfe80364d63f27c2b33 Mon Sep 17 00:00:00 2001 From: Vincent Ambo Date: Sun, 26 Feb 2023 18:48:22 +0300 Subject: refactor(tvix/eval): merge OpCall & OpTailCall As applies are thunked, there was no situation where OpCall could be emitted. In practice, all calls were already tail calls. Change-Id: Id0d441dcdd86f804d7cddd0cc14f589bbfc75e5b Reviewed-on: https://cl.tvl.fyi/c/depot/+/8147 Tested-by: BuildkiteCI Reviewed-by: raitobezarius --- tvix/eval/src/compiler/mod.rs | 18 ------------------ tvix/eval/src/opcode.rs | 1 - tvix/eval/src/vm.rs | 5 ----- 3 files changed, 24 deletions(-) (limited to 'tvix/eval/src') diff --git a/tvix/eval/src/compiler/mod.rs b/tvix/eval/src/compiler/mod.rs index 6dd0b669f957..a59f935b0494 100644 --- a/tvix/eval/src/compiler/mod.rs +++ b/tvix/eval/src/compiler/mod.rs @@ -1019,11 +1019,6 @@ impl Compiler<'_> { // lambda as a constant. let mut compiled = self.contexts.pop().unwrap(); - // Check if tail-call optimisation is possible and perform it. - if self.dead_scope == 0 { - optimise_tail_call(&mut compiled.lambda.chunk); - } - // Capturing the with stack counts as an upvalue, as it is // emitted as an upvalue data instruction. if compiled.captures_with_stack { @@ -1288,19 +1283,6 @@ fn expr_static_attr_str(node: &ast::Attr) -> Option { } } -/// Perform tail-call optimisation if the last call within a -/// compiled chunk is another call. -fn optimise_tail_call(chunk: &mut Chunk) { - let last_op = chunk - .code - .last_mut() - .expect("compiler bug: chunk should never be empty"); - - if matches!(last_op, OpCode::OpCall) { - *last_op = OpCode::OpTailCall; - } -} - /// Create a delayed source-only builtin compilation, for a builtin /// which is written in Nix code. /// diff --git a/tvix/eval/src/opcode.rs b/tvix/eval/src/opcode.rs index a49bee425dea..445b994b04d8 100644 --- a/tvix/eval/src/opcode.rs +++ b/tvix/eval/src/opcode.rs @@ -141,7 +141,6 @@ pub enum OpCode { // Lambdas & closures OpCall, - OpTailCall, OpGetUpvalue(UpvalueIdx), /// A Closure which has upvalues but no self-references OpClosure(ConstantIdx), diff --git a/tvix/eval/src/vm.rs b/tvix/eval/src/vm.rs index cd6fc211b4ad..10966aca811b 100644 --- a/tvix/eval/src/vm.rs +++ b/tvix/eval/src/vm.rs @@ -955,11 +955,6 @@ impl<'o> VM<'o> { } OpCode::OpCall => { - let callable = self.pop(); - self.call_value(&callable)?; - } - - OpCode::OpTailCall => { let callable = self.pop(); self.tail_call_value(callable)?; } -- cgit 1.4.1