-! Copyright (C) 2010 Slava Pestov.
+! Copyright (C) 2010 Slava Pestov, 2011 Alex Vondrak
! See http://factorcode.org/license.txt for BSD license.
-USING: accessors combinators combinators.short-circuit fry
-kernel make math sequences
-cpu.architecture
-compiler.cfg.hats
-compiler.cfg.utilities
-compiler.cfg.registers
-compiler.cfg.instructions
-compiler.cfg.gvn.math
-compiler.cfg.gvn.graph
-compiler.cfg.gvn.rewrite ;
+USING: accessors combinators combinators.short-circuit
+compiler.cfg.gvn.avail compiler.cfg.gvn.graph
+compiler.cfg.gvn.math compiler.cfg.gvn.rewrite compiler.cfg.hats
+compiler.cfg.instructions compiler.cfg.utilities
+cpu.architecture kernel make math namespaces sequences ;
IN: compiler.cfg.gvn.alien
M: ##box-displaced-alien rewrite
: rewrite-unbox-alien ( insn box-insn -- insn )
[ dst>> ] [ src>> ] bi* <copy> ;
+! XXX next-vreg makes vregs>vns change on every iteration
+! (hidden in ^^unbox-c-ptr)
: rewrite-unbox-displaced-alien ( insn box-insn -- insns )
[
[ dst>> ]
[ [ base>> ] [ base-class>> ] [ displacement>> ] tri ] bi*
[ ^^unbox-c-ptr ] dip
- ##add
+ ##add,
] { } make ;
: rewrite-unbox-any-c-ptr ( insn -- insn/f )
dup src>> vreg>insn
{
- { [ dup ##box-alien? ] [ rewrite-unbox-alien ] }
- { [ dup ##box-displaced-alien? ] [ rewrite-unbox-displaced-alien ] }
+ {
+ [ dup [ ##box-alien? ] with-available-uses? ]
+ [ rewrite-unbox-alien ]
+ }
+ {
+ ! [ dup [ ##box-displaced-alien? ] with-available-uses? ]
+ [
+ final-iteration? get [
+ dup [ ##box-displaced-alien? ] with-available-uses?
+ ] [ f ] if
+ ]
+ [ rewrite-unbox-displaced-alien ]
+ }
[ 2drop f ]
} cond ;
! Fuse ##add-imm into ##load-memory(-imm) and ##store-memory(-imm)
! just update the offset in the instruction
: fuse-base-offset? ( insn -- ? )
- base>> vreg>insn ##add-imm? ;
+ base>> vreg>insn [ ##add-imm? ] with-available-uses? ;
: fuse-base-offset ( insn -- insn' )
clone dup base>> vreg>insn
! Fuse ##add-imm into ##load-memory and ##store-memory
! just update the offset in the instruction
: fuse-displacement-offset? ( insn -- ? )
- { [ scale>> 0 = ] [ displacement>> vreg>insn ##add-imm? ] } 1&& ;
+ {
+ [ scale>> 0 = ]
+ [ displacement>> vreg>insn [ ##add-imm? ] with-available-uses? ]
+ } 1&& ;
: fuse-displacement-offset ( insn -- insn' )
clone dup displacement>> vreg>insn
: fuse-displacement? ( insn -- ? )
{
[ offset>> 0 = complex-addressing? or ]
- [ base>> vreg>insn ##add? ]
+ [ base>> vreg>insn [ ##add? ] with-available-uses? ]
} 1&& ;
GENERIC: alien-insn-value ( insn -- value )
GENERIC: new-alien-insn ( value base displacement scale offset rep c-type insn -- insn )
-M: ##load-memory-imm new-alien-insn drop \ ##load-memory new-insn ;
-M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ;
+M: ##load-memory-imm new-alien-insn drop ##load-memory new-insn ;
+M: ##store-memory-imm new-alien-insn drop ##store-memory new-insn ;
: fuse-displacement ( insn -- insn' )
{
{ [ ##shl-imm? ] [ src2>> { 1 2 3 } member? ] } 1&& ;
: fuse-scale? ( insn -- ? )
- { [ scale>> 0 = ] [ displacement>> vreg>insn scale-insn? ] } 1&& ;
+ {
+ [ scale>> 0 = ]
+ [ displacement>> vreg>insn [ scale-insn? ] with-available-uses? ]
+ } 1&& ;
: fuse-scale ( insn -- insn' )
clone dup displacement>> vreg>insn