! Copyright (C) 2009 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. USING: assocs compiler.cfg.instructions compiler.cfg.registers compiler.cfg.ssa.destruction.leaders cpu.architecture deques dlists fry kernel locals namespaces sequences ; FROM: sets => conjoin ; IN: compiler.cfg.parallel-copy to-do set ready set [ preds set ] [ [ nip dup ] H{ } assoc-map-as locs set ] [ keys [ init-to-do ] [ init-ready ] bi ] tri ; :: process-ready ( b quot: ( dst src -- ) -- ) b preds get at :> a a locs get at :> c b c quot call b a locs get set-at a c = a preds get at and [ a ready get push-front ] when ; inline :: process-to-do ( b temp: ( src -- dst ) quot: ( dst src -- ) -- ) b locs get at b = [ b temp call :> temp temp b quot call temp b locs get set-at b ready get push-front ] when ; inline PRIVATE> :: parallel-mapping ( mapping temp: ( src -- dst ) quot: ( dst src -- ) -- ) ! mapping is a list of { dst src } pairs [ mapping init to-do get [ ready get [ quot process-ready ] slurp-deque temp quot process-to-do ] slurp-deque ] with-scope ; inline : parallel-copy ( mapping -- ) next-vreg '[ drop _ ] [ any-rep ##copy, ] parallel-mapping ; : parallel-copy-rep ( mapping -- ) ! mapping is a list of { dst src } pairs H{ } clone temp-vregs set [ rep-of temp-vreg ] [ dup rep-of ##copy, ] parallel-mapping ;