base>> vreg>insn ##add-imm? ;
: fuse-base-offset ( insn -- insn' )
- dup base>> vreg>insn
+ clone dup base>> vreg>insn
[ src1>> ] [ src2>> ] bi
[ >>base ] [ '[ _ + ] change-offset ] bi* ;
{ [ scale>> 0 = ] [ displacement>> vreg>insn ##add-imm? ] } 1&& ;
: fuse-displacement-offset ( insn -- insn' )
- dup displacement>> vreg>insn
+ clone dup displacement>> vreg>insn
[ src1>> ] [ src2>> ] bi
[ >>displacement ] [ '[ _ + ] change-offset ] bi* ;
{ [ scale>> 0 = ] [ displacement>> vreg>insn scale-insn? ] } 1&& ;
: fuse-scale ( insn -- insn' )
- dup displacement>> vreg>insn
+ clone dup displacement>> vreg>insn
[ src1>> ] [ src2>> ] bi
[ >>displacement ] [ >>scale ] bi* ;
: value-numbering-step ( insns -- insns' )
[ process-instruction ] map flatten ;
-! FIXME there's going to be trouble with certain rewrites that
-! modify the cfg / instructions destructively; namely those in
-! alien.factor
-
: value-numbering-iteration ( cfg -- )
clear-exprs
[ value-numbering-step drop ] simple-analysis ;