diff --git a/basis/compiler/cfg/cfg.factor b/basis/compiler/cfg/cfg.factor index b279c5b6b2..68d7e15a5d 100644 --- a/basis/compiler/cfg/cfg.factor +++ b/basis/compiler/cfg/cfg.factor @@ -1,6 +1,6 @@ ! Copyright (C) 2008, 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: kernel arrays vectors accessors +USING: kernel arrays vectors accessors assocs sets namespaces math make fry sequences combinators.short-circuit compiler.cfg.instructions ; @@ -28,8 +28,18 @@ M: basic-block hashcode* nip id>> ; [ first ##branch? ] } 1&& ; +SYMBOL: visited + +: (skip-empty-blocks) ( bb -- bb' ) + dup visited get key? [ + dup empty-block? [ + dup visited get conjoin + successors>> first (skip-empty-blocks) + ] when + ] unless ; + : skip-empty-blocks ( bb -- bb' ) - dup empty-block? [ successors>> first skip-empty-blocks ] when ; + H{ } clone visited [ (skip-empty-blocks) ] with-variable ; : add-instructions ( bb quot -- ) [ instructions>> building ] dip '[ diff --git a/basis/compiler/cfg/useless-conditionals/useless-conditionals.factor b/basis/compiler/cfg/useless-conditionals/useless-conditionals.factor index 7c32f3f8f8..6f4a6eea55 100644 --- a/basis/compiler/cfg/useless-conditionals/useless-conditionals.factor +++ b/basis/compiler/cfg/useless-conditionals/useless-conditionals.factor @@ -6,7 +6,6 @@ IN: compiler.cfg.useless-conditionals : delete-conditional? ( bb -- ? ) { - [ instructions>> length 1 > ] [ instructions>> last class { ##compare-branch ##compare-imm-branch ##compare-float-branch } memq? ] [ successors>> first2 [ skip-empty-blocks ] bi@ eq? ] } 1&& ;