} cond ;
: fold-branch ( ? -- insn )
- drop
- ! 0 1 ?
- ! basic-block get [ nth 1vector ] change-successors drop
+ final-iteration? get [
+ 0 1 ?
+ basic-block get [ nth 1vector ] change-successors drop
+ ] [ drop ] if
\ ##branch new-insn ;
: fold-compare-imm-branch ( insn -- insn/f )
[ src1>> vreg>insn [ src1>> ] [ src2>> ] bi ] [ cc>> ] bi ; inline
: simplify-test ( insn -- insn )
- dup (simplify-test) drop [ >>src1 ] [ >>src2 ] bi* ; inline
+ [ dst>> ] [ (simplify-test) ] [ temp>> ] tri \ ##test new-insn ; inline
: simplify-test-branch ( insn -- insn )
- dup (simplify-test) drop [ >>src1 ] [ >>src2 ] bi* ; inline
+ (simplify-test) \ ##test-branch new-insn ; inline
: (simplify-test-imm) ( insn -- src1 src2 cc )
[ src1>> vreg>insn [ src1>> ] [ src2>> ] bi ] [ cc>> ] bi ; inline
! FIXME there's going to be trouble with certain rewrites that
! modify the cfg / instructions destructively; namely those in
-! comparisons.factor, alien.factor, and slots.factor
+! alien.factor and slots.factor
: value-numbering-iteration ( cfg -- )
clear-exprs
[ value-numbering-step drop ] simple-analysis ;
: identify-redundancies ( cfg -- )
+ final-iteration? off
init-value-graph
'[
changed? off
] loop ;
: eliminate-redundancies ( cfg -- )
+ final-iteration? on
clear-exprs
[ value-numbering-step ] simple-optimization ;
M: insn rewrite drop f ;
+! Boolean to track when it's safe to alter the CFG in a rewrite
+! method (i.e., after we've already iterated till fixpoint)
+SYMBOL: final-iteration?
+
! Utilities
GENERIC: insn>integer ( insn -- n )