From 46331ebefa5a21233dddfe489869dbbc80c2a61c Mon Sep 17 00:00:00 2001 From: slava Date: Thu, 2 Mar 2006 06:12:32 +0000 Subject: [PATCH] Rewritten linearizer --- library/alien/alien-callback.factor | 2 +- library/alien/alien-invoke.factor | 5 +- library/bootstrap/boot-stage1.factor | 1 - library/compiler/linearizer.factor | 142 +++++++++++++++--------- library/compiler/stack.factor | 6 +- library/inference/inline-methods.factor | 23 ++++ library/inference/kill-literals.factor | 28 +++-- library/inference/optimizer.factor | 18 +-- library/inference/split-nodes.factor | 62 ----------- library/syntax/parse-syntax.factor | 2 +- 10 files changed, 141 insertions(+), 148 deletions(-) delete mode 100644 library/inference/split-nodes.factor diff --git a/library/alien/alien-callback.factor b/library/alien/alien-callback.factor index 188b4077c1..cad4e2f182 100644 --- a/library/alien/alien-callback.factor +++ b/library/alien/alien-callback.factor @@ -62,4 +62,4 @@ M: alien-callback-error summary ( error -- ) ] make-linear ; M: alien-callback linearize* ( node -- ) - compile-gc dup linearize-callback linearize-next ; + compile-gc linearize-callback iterate-next ; diff --git a/library/alien/alien-invoke.factor b/library/alien/alien-invoke.factor index 7b8b880dc8..cc5706df34 100644 --- a/library/alien/alien-invoke.factor +++ b/library/alien/alien-invoke.factor @@ -73,9 +73,8 @@ M: alien-invoke linearize* ( node -- ) compile-gc dup alien-invoke-parameters objects>registers dup alien-invoke-dlsym %alien-invoke , - dup linearize-cleanup - dup box-return - linearize-next ; + dup linearize-cleanup box-return + iterate-next ; : parse-arglist ( return seq -- types stack-effect ) unpair [ diff --git a/library/bootstrap/boot-stage1.factor b/library/bootstrap/boot-stage1.factor index 54236d112c..65ce254ecf 100644 --- a/library/bootstrap/boot-stage1.factor +++ b/library/bootstrap/boot-stage1.factor @@ -120,7 +120,6 @@ vectors words ; "/library/inference/words.factor" "/library/inference/class-infer.factor" "/library/inference/kill-literals.factor" - "/library/inference/split-nodes.factor" "/library/inference/optimizer.factor" "/library/inference/inline-methods.factor" "/library/inference/known-words.factor" diff --git a/library/compiler/linearizer.factor b/library/compiler/linearizer.factor index 2183e9b5d1..721be671b3 100644 --- a/library/compiler/linearizer.factor +++ b/library/compiler/linearizer.factor @@ -1,14 +1,48 @@ -! Copyright (C) 2004, 2005 Slava Pestov. -! See http://factor.sf.net/license.txt for BSD license. +! Copyright (C) 2004, 2006 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: arrays compiler-backend hashtables inference kernel +namespaces sequences words ; IN: compiler-frontend -USING: arrays compiler-backend errors generic hashtables -inference kernel math namespaces prettyprint sequences -strings words ; -: in-1 0 0 %peek-d , ; -: in-2 0 1 %peek-d , 1 0 %peek-d , ; -: in-3 0 2 %peek-d , 1 1 %peek-d , 2 0 %peek-d , ; -: out-1 T{ vreg f 0 } 0 %replace-d , ; +SYMBOL: node-stack + +: >node node-stack get push ; +: node> node-stack get pop ; +: node@ node-stack get peek ; + +DEFER: iterate-nodes + +: iterate-children ( quot -- ) + node@ node-children [ swap iterate-nodes ] each ; + +: iterate-next ( -- node ) node@ node-successor ; + +: iterate-nodes ( node quot -- ) + over [ + [ swap >node call node> drop ] keep + over [ iterate-nodes ] [ 2drop ] if + ] [ + 2drop + ] if ; inline + +: with-node-iterator ( quot -- ) + [ + V{ } clone node-stack set call + ] with-scope ; inline + +DEFER: #terminal? + +PREDICATE: #merge #terminal-merge node-successor #terminal? ; + +UNION: #terminal POSTPONE: f #return #values #terminal-merge ; + +: tail-call? ( -- ? ) + node-stack get [ node-successor ] map [ #terminal? ] all? ; + +GENERIC: linearize* ( node -- next ) + +: linearize-child ( node -- ) + [ node@ linearize* ] iterate-nodes ; ! A map from words to linear IR. SYMBOL: linearized @@ -17,20 +51,14 @@ SYMBOL: linearized ! name in different scopes. SYMBOL: renamed-labels -: rename-label ( label -- label ) -