diff --git a/extra/compiler/cfg/gvn/comparisons/comparisons.factor b/extra/compiler/cfg/gvn/comparisons/comparisons.factor index 109a694b48..9437c83a4f 100644 --- a/extra/compiler/cfg/gvn/comparisons/comparisons.factor +++ b/extra/compiler/cfg/gvn/comparisons/comparisons.factor @@ -98,9 +98,10 @@ UNION: general-compare-insn scalar-compare-insn ##test-vector ; } 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 ) @@ -257,10 +258,10 @@ M: ##compare-integer-imm rewrite [ 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 diff --git a/extra/compiler/cfg/gvn/gvn.factor b/extra/compiler/cfg/gvn/gvn.factor index bc63fd0f99..56ea3023d2 100644 --- a/extra/compiler/cfg/gvn/gvn.factor +++ b/extra/compiler/cfg/gvn/gvn.factor @@ -51,13 +51,14 @@ M: array process-instruction ! 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 @@ -66,6 +67,7 @@ M: array process-instruction ] loop ; : eliminate-redundancies ( cfg -- ) + final-iteration? on clear-exprs [ value-numbering-step ] simple-optimization ; diff --git a/extra/compiler/cfg/gvn/rewrite/rewrite.factor b/extra/compiler/cfg/gvn/rewrite/rewrite.factor index dbbfe86df2..2d62bb6c19 100644 --- a/extra/compiler/cfg/gvn/rewrite/rewrite.factor +++ b/extra/compiler/cfg/gvn/rewrite/rewrite.factor @@ -11,6 +11,10 @@ GENERIC: rewrite ( insn -- insn/f ) 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 )