123 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2008, 2011 Slava Pestov, Daniel Ehrenberg.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: accessors arrays assocs combinators compiler.cfg
 | |
| compiler.cfg.instructions compiler.cfg.instructions.syntax
 | |
| compiler.cfg.rpo compiler.units fry generic kernel namespaces
 | |
| quotations sequences sequences.generalizations sets slots words ;
 | |
| IN: compiler.cfg.def-use
 | |
| 
 | |
| ! Utilities for iterating over instruction operands
 | |
| 
 | |
| GENERIC: defs-vregs ( insn -- seq )
 | |
| GENERIC: temp-vregs ( insn -- seq )
 | |
| GENERIC: uses-vregs ( insn -- seq )
 | |
| 
 | |
| M: insn defs-vregs drop { } ;
 | |
| M: insn temp-vregs drop { } ;
 | |
| M: insn uses-vregs drop { } ;
 | |
| 
 | |
| CONSTANT: special-vreg-insns {
 | |
|     ##parallel-copy
 | |
|     ##phi
 | |
|     ##alien-invoke
 | |
|     ##alien-indirect
 | |
|     ##alien-assembly
 | |
|     ##callback-inputs
 | |
|     ##callback-outputs
 | |
| }
 | |
| 
 | |
| ! Special defs-vregs methods
 | |
| M: ##parallel-copy defs-vregs values>> [ first ] map ;
 | |
| 
 | |
| M: ##phi defs-vregs dst>> 1array ;
 | |
| 
 | |
| M: alien-call-insn defs-vregs
 | |
|     reg-outputs>> [ first ] map ;
 | |
| 
 | |
| M: ##callback-inputs defs-vregs
 | |
|     [ reg-outputs>> ] [ stack-outputs>> ] bi append [ first ] map ;
 | |
| 
 | |
| M: ##callback-outputs defs-vregs drop { } ;
 | |
| 
 | |
| ! Special uses-vregs methods
 | |
| M: ##parallel-copy uses-vregs values>> [ second ] map ;
 | |
| 
 | |
| M: ##phi uses-vregs inputs>> values ;
 | |
| 
 | |
| M: alien-call-insn uses-vregs
 | |
|     [ reg-inputs>> ] [ stack-inputs>> ] bi append [ first ] map ;
 | |
| 
 | |
| M: ##alien-indirect uses-vregs
 | |
|     [ call-next-method ] [ src>> ] bi prefix ;
 | |
| 
 | |
| M: ##callback-inputs uses-vregs
 | |
|     drop { } ;
 | |
| 
 | |
| M: ##callback-outputs uses-vregs
 | |
|     reg-inputs>> [ first ] map ;
 | |
| 
 | |
| ! Generate defs-vregs, uses-vregs and temp-vregs for everything
 | |
| ! else
 | |
| <PRIVATE
 | |
| 
 | |
| : slot-array-quot ( slots -- quot )
 | |
|     [ reader-word 1quotation ] map dup length {
 | |
|         { 0 [ drop [ drop f ] ] }
 | |
|         { 1 [ first [ 1array ] compose ] }
 | |
|         { 2 [ first2 '[ _ _ bi 2array ] ] }
 | |
|         [ '[ _ cleave _ narray ] ]
 | |
|     } case ;
 | |
| 
 | |
| : define-vregs-method ( insn slots word -- )
 | |
|     [ [ drop ] ] dip '[
 | |
|         [ _ create-method ]
 | |
|         [ [ name>> ] map slot-array-quot ] bi*
 | |
|         define
 | |
|     ] if-empty ; inline
 | |
| 
 | |
| : define-defs-vregs-method ( insn -- )
 | |
|     dup insn-def-slots \ defs-vregs define-vregs-method ;
 | |
| 
 | |
| : define-uses-vregs-method ( insn -- )
 | |
|     dup insn-use-slots \ uses-vregs define-vregs-method ;
 | |
| 
 | |
| : define-temp-vregs-method ( insn -- )
 | |
|     dup insn-temp-slots \ temp-vregs define-vregs-method ;
 | |
| 
 | |
| PRIVATE>
 | |
| 
 | |
| [
 | |
|     insn-classes get
 | |
|     [ special-vreg-insns diff [ define-defs-vregs-method ] each ]
 | |
|     [ special-vreg-insns diff [ define-uses-vregs-method ] each ]
 | |
|     [ [ define-temp-vregs-method ] each ]
 | |
|     tri
 | |
| ] with-compilation-unit
 | |
| 
 | |
| ! Computing vreg -> insn -> bb mapping
 | |
| SYMBOLS: defs insns ;
 | |
| 
 | |
| : def-of ( vreg -- node ) defs get at ;
 | |
| : insn-of ( vreg -- insn ) insns get at ;
 | |
| 
 | |
| : set-def-of ( obj insn assoc -- )
 | |
|     swap defs-vregs [ swap set-at ] 2with each ;
 | |
| 
 | |
| : compute-defs ( cfg -- )
 | |
|     H{ } clone [
 | |
|         '[
 | |
|             [ basic-block get ] dip [
 | |
|                 _ set-def-of
 | |
|             ] with each
 | |
|         ] simple-analysis
 | |
|     ] keep defs set ;
 | |
| 
 | |
| : compute-insns ( cfg -- )
 | |
|     H{ } clone [
 | |
|         '[
 | |
|             [
 | |
|                 dup _ set-def-of
 | |
|             ] each
 | |
|         ] simple-analysis
 | |
|     ] keep insns set ;
 |