]> gitweb.factorcode.org Git - factor.git/commitdiff
Better CFG checker
authorSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 27 May 2009 23:58:14 +0000 (18:58 -0500)
committerSlava Pestov <slava@slava-pestovs-macbook-pro.local>
Wed, 27 May 2009 23:58:14 +0000 (18:58 -0500)
basis/compiler/cfg/checker/checker.factor

index 3a9d4a2b902976e2d7c9794029a4f810a0a2ac4c..53f0557db54d3dc3373156de5f5621fe51e38890 100644 (file)
@@ -1,12 +1,13 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel compiler.cfg.instructions compiler.cfg.rpo sequences
-combinators.short-circuit accessors ;
+USING: kernel compiler.cfg.instructions compiler.cfg.rpo compiler.cfg.def-use
+compiler.cfg.linearization combinators.short-circuit accessors math
+sequences sets ;
 IN: compiler.cfg.checker
 
 ERROR: last-insn-not-a-jump insn ;
 
-: check-basic-block ( bb -- )
+: check-last-instruction ( bb -- )
     peek dup {
         [ ##branch? ]
         [ ##conditional-branch? ]
@@ -18,8 +19,28 @@ ERROR: last-insn-not-a-jump insn ;
         [ ##dispatch-label? ]
     } 1|| [ drop ] [ last-insn-not-a-jump ] if ;
 
+ERROR: bad-loop-entry ;
+
+: check-loop-entry ( bb -- )
+    dup length 2 >= [
+        2 head* [ ##loop-entry? ] any?
+        [ bad-loop-entry ] when
+    ] [ drop ] if ;
+
+: check-basic-block ( bb -- )
+    [ check-last-instruction ] [ check-loop-entry ] bi ;
+
 : check-rpo ( rpo -- )
     [ instructions>> check-basic-block ] each ;
 
+ERROR: undefined-values uses defs ;
+
+: check-mr ( mr -- )
+    ! Check that every used register has a definition
+    instructions>>
+    [ [ uses-vregs ] map concat ]
+    [ [ defs-vregs ] map concat ] bi
+    2dup subset? [ 2drop ] [ undefined-values ] if ;
+
 : check-cfg ( cfg -- )
-    reverse-post-order check-rpo ;
\ No newline at end of file
+    [ reverse-post-order check-rpo ] [ build-mr check-mr ] bi ;