]> gitweb.factorcode.org Git - factor.git/blobdiff - extra/compiler/cfg/gvn/avail/avail.factor
factor: trim using lists
[factor.git] / extra / compiler / cfg / gvn / avail / avail.factor
index e7d0db8cd39f3847658cf72c5a79f1f093b3d83e..c72cbc51d75e905434371576dca86f8fe304c9cd 100644 (file)
@@ -1,14 +1,9 @@
 ! Copyright (C) 2011 Alex Vondrak.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs hashtables kernel namespaces sequences
-sets
-compiler.cfg
-compiler.cfg.dataflow-analysis
-compiler.cfg.def-use
-compiler.cfg.gvn.graph
-compiler.cfg.predecessors
-compiler.cfg.rpo ;
-FROM: namespaces => set ;
+USING: accessors assocs compiler.cfg
+compiler.cfg.dataflow-analysis compiler.cfg.def-use
+compiler.cfg.gvn.graph compiler.cfg.renaming.functor
+compiler.utilities hashtables kernel namespaces sequences ;
 IN: compiler.cfg.gvn.avail
 
 : defined ( bb -- vregs )
@@ -19,23 +14,25 @@ IN: compiler.cfg.gvn.avail
 
 FORWARD-ANALYSIS: avail
 
-M: avail-analysis transfer-set drop defined assoc-union ;
+M: avail transfer-set drop defined assoc-union ;
 
-! Strict idea of availability, for now.  Would like to see if
-! searching the VN congruence classes for the smallest
-! available vn would work at all / better.
+: available? ( vn -- ? ) basic-block get avail-in key? ;
 
-: available? ( vn -- ? )
+: best-vreg ( available-vregs -- vreg )
+    [ f ] [ infimum ] if-empty ;
+
+: >avail-vreg ( vreg -- vreg/f )
     final-iteration? get [
-        basic-block get avail-in key?
-    ] [ drop t ] if ;
+        congruence-class [ available? ] filter best-vreg
+    ] when ;
 
 : available-uses? ( insn -- ? )
-    uses-vregs [ available? ] all? ;
+    uses-vregs [ >avail-vreg ] all? ;
 
 : with-available-uses? ( quot -- ? )
-    [ available-uses? ] bi and ; inline
+    keep swap [ available-uses? ] [ drop f ] if ; inline
+
+: make-available ( vreg -- )
+    basic-block get avail-ins get [ dupd clone ?set-at ] assocs:change-at ;
 
-: make-available ( insn -- insn )
-    dup dst>>
-    basic-block get avail-ins get [ dupd clone ?set-at ] change-at ;
+RENAMING: >avail [ ] [ dup >avail-vreg swap or ] [ ]