From fc595a70750ae5bca462d601d41bd43bc0059e50 Mon Sep 17 00:00:00 2001
From: Slava Pestov <slava@slava-pestovs-macbook-pro.local>
Date: Tue, 30 Jun 2009 22:43:02 -0500
Subject: [PATCH] Fix possible infinite loop in skip-empty-blocks and remove
 redundant test in compiler.cfg.useless-conditionals

---
 basis/compiler/cfg/cfg.factor                      | 14 ++++++++++++--
 .../useless-conditionals.factor                    |  1 -
 2 files changed, 12 insertions(+), 3 deletions(-)

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&& ;