From 7c6999872a994f1ea09b21b5da0f86f90fb15cf2 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@oberon.internal.stack-effects.com>
Date: Tue, 12 Feb 2008 17:32:17 -0600
Subject: [PATCH] Clean up tail call optimization

---
 core/generator/generator.factor         | 30 +++++--------------------
 core/inference/dataflow/dataflow.factor | 12 ++++++++++
 2 files changed, 18 insertions(+), 24 deletions(-)

diff --git a/core/generator/generator.factor b/core/generator/generator.factor
index d8164fdce7..f417869715 100755
--- a/core/generator/generator.factor
+++ b/core/generator/generator.factor
@@ -82,25 +82,6 @@ GENERIC: generate-node ( node -- next )
 : if-intrinsics ( #call -- quot )
     node-param "if-intrinsics" word-prop ;
 
-DEFER: #terminal?
-
-PREDICATE: #merge #terminal-merge node-successor #terminal? ;
-
-PREDICATE: #values #terminal-values node-successor #terminal? ;
-
-PREDICATE: #call #terminal-call
-    dup node-successor #if?
-    over node-successor node-successor #terminal? and
-    swap if-intrinsics and ;
-
-UNION: #terminal
-    POSTPONE: f #return #terminal-values #terminal-merge ;
-
-: tail-call? ( -- ? )
-    node-stack get [
-        dup #terminal-call? swap node-successor #terminal? or
-    ] all? ;
-
 ! node
 M: node generate-node drop iterate-next ;
 
@@ -224,10 +205,11 @@ M: #dispatch generate-node
 : define-if-intrinsic ( word quot inputs -- )
     2array 1array define-if-intrinsics ;
 
-: do-if-intrinsic ( #call pair -- next )
-    <label> [ swap do-template ] keep
-    >r node-successor r> generate-if
-    node-successor ;
+: do-if-intrinsic ( pair -- next )
+    <label> [
+        swap do-template
+        node> node-successor dup >node
+    ] keep generate-if ;
 
 : find-intrinsic ( #call -- pair/f )
     intrinsics find-template ;
@@ -249,7 +231,7 @@ M: #call generate-node
         ] [
             node-param generate-call
         ] ?if
-    ] if* ;
+    ] ?if ;
 
 ! #call-label
 M: #call-label generate-node node-param generate-call ;
diff --git a/core/inference/dataflow/dataflow.factor b/core/inference/dataflow/dataflow.factor
index 71cb0eef65..d76ab031f2 100755
--- a/core/inference/dataflow/dataflow.factor
+++ b/core/inference/dataflow/dataflow.factor
@@ -304,3 +304,15 @@ SYMBOL: node-stack
     node-children
     [ last-node ] map
     [ #terminate? not ] subset ;
+
+DEFER: #tail?
+
+PREDICATE: #merge #tail-merge node-successor #tail? ;
+
+PREDICATE: #values #tail-values node-successor #tail? ;
+
+UNION: #tail
+    POSTPONE: f #return #tail-values #tail-merge ;
+
+: tail-call? ( -- ? )
+    node-stack get [ node-successor #tail? ] all? ;