From 8e46305288ae85c658e57ae5b8a41f0df4885813 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Mon, 19 Jul 2010 09:27:10 -0400 Subject: [PATCH] compiler.cfg.save-contexts: don't insert ##save-context in front of ##phi --- basis/compiler/cfg/def-use/def-use.factor | 8 +- .../cfg/liveness/liveness-tests.factor | 109 ++++++++++++++++-- .../save-contexts/save-contexts-tests.factor | 17 +++ .../cfg/save-contexts/save-contexts.factor | 1 + 4 files changed, 122 insertions(+), 13 deletions(-) diff --git a/basis/compiler/cfg/def-use/def-use.factor b/basis/compiler/cfg/def-use/def-use.factor index bfbf13e1a9..99e87b277b 100644 --- a/basis/compiler/cfg/def-use/def-use.factor +++ b/basis/compiler/cfg/def-use/def-use.factor @@ -80,12 +80,9 @@ M: ##callback-outputs uses-vregs tri ] with-compilation-unit -! Computing def-use chains. - -SYMBOLS: defs insns uses ; +SYMBOLS: defs insns ; : def-of ( vreg -- node ) defs get at ; -: uses-of ( vreg -- nodes ) uses get at ; : insn-of ( vreg -- insn ) insns get at ; : set-def-of ( obj insn assoc -- ) @@ -98,8 +95,7 @@ SYMBOLS: defs insns uses ; _ set-def-of ] with each ] each-basic-block - ] keep - defs set ; + ] keep defs set ; : compute-insns ( cfg -- ) H{ } clone [ diff --git a/basis/compiler/cfg/liveness/liveness-tests.factor b/basis/compiler/cfg/liveness/liveness-tests.factor index e4f5144e1f..b86f04b8b0 100644 --- a/basis/compiler/cfg/liveness/liveness-tests.factor +++ b/basis/compiler/cfg/liveness/liveness-tests.factor @@ -1,13 +1,19 @@ -USING: compiler.cfg.liveness compiler.cfg.debugger -compiler.cfg.instructions compiler.cfg.predecessors -compiler.cfg.registers compiler.cfg cpu.architecture -accessors namespaces sequences kernel tools.test vectors ; +USING: compiler.cfg.liveness compiler.cfg.liveness.ssa +compiler.cfg.debugger compiler.cfg.instructions +compiler.cfg.predecessors compiler.cfg.registers compiler.cfg +cpu.architecture accessors namespaces sequences kernel +tools.test vectors alien math compiler.cfg.comparisons +cpu.x86.assembler.operands ; IN: compiler.cfg.liveness.tests : test-liveness ( -- ) cfg new 1 get >>entry compute-live-sets ; +: test-ssa-liveness ( -- ) + cfg new 1 get >>entry + compute-ssa-live-sets ; + ! Sanity check... V{ @@ -30,7 +36,7 @@ V{ 1 { 2 3 } edges -test-liveness +[ ] [ test-liveness ] unit-test [ H{ @@ -56,6 +62,95 @@ V{ 1 2 edge -test-liveness +[ ] [ test-liveness ] unit-test -[ H{ { 0 0 } } ] [ 2 get live-in ] unit-test \ No newline at end of file +[ H{ { 0 0 } } ] [ 2 get live-in ] unit-test + +! Regression +V{ + T{ ##prologue } + T{ ##branch } +} 0 test-bb + +V{ + T{ ##inc-r f 2 } + T{ ##inc-d f -2 } + T{ ##peek f 21 D -1 } + T{ ##peek f 22 D -2 } + T{ ##replace f 21 R 0 } + T{ ##replace f 22 R 1 } + T{ ##branch } +} 1 test-bb + +V{ + T{ ##call f >c-ptr } + T{ ##branch } +} 2 test-bb + +V{ + T{ ##inc-r f -1 } + T{ ##inc-d f 1 } + T{ ##peek f 25 R -1 } + T{ ##replace f 25 D 0 } + T{ ##branch } +} 3 test-bb + +V{ + T{ ##call f >float } + T{ ##branch } +} 4 test-bb + +V{ + T{ ##inc-r f -1 } + T{ ##inc-d f 2 } + T{ ##peek f 27 R -1 } + T{ ##peek f 28 D 2 } + T{ ##peek f 29 D 3 } + T{ ##load-integer f 30 1 } + T{ ##load-integer f 31 0 } + T{ ##compare-imm-branch f 27 f cc/= } +} 5 test-bb + +V{ + T{ ##inc-d f -1 } + T{ ##branch } +} 6 test-bb + +V{ + T{ ##inc-d f -1 } + T{ ##branch } +} 7 test-bb + +V{ + T{ ##phi f 36 H{ { 6 30 } { 7 31 } } } + T{ ##inc-d f -2 } + T{ ##unbox f 37 29 "alien_offset" int-rep } + T{ ##unbox f 38 28 "to_double" double-rep } + T{ ##unbox f 39 36 "to_cell" int-rep } + T{ ##alien-invoke f V{ } V{ { 37 int-rep 0 } { 38 double-rep 4 } { 39 int-rep 12 } } { { 40 int-rep EAX } } 0 16 "CFRunLoopRunInMode" f T{ gc-map } } + T{ ##box f 41 40 "from_signed_cell" int-rep T{ gc-map } } + T{ ##replace f 41 D 0 } + T{ ##branch } +} 8 test-bb + +V{ + T{ ##epilogue } + T{ ##return } +} 9 test-bb + +0 1 edge +1 2 edge +2 3 edge +3 4 edge +4 5 edge +5 { 6 7 } edges +6 8 edge +7 8 edge +8 9 edge + +[ ] [ test-ssa-liveness ] unit-test + +[ H{ { 28 28 } { 29 29 } { 30 30 } { 31 31 } } ] [ 5 get live-out ] unit-test +[ H{ { 28 28 } { 29 29 } { 30 30 } } ] [ 6 get live-in ] unit-test +[ H{ { 28 28 } { 29 29 } { 31 31 } } ] [ 7 get live-in ] unit-test +[ H{ { 30 30 } } ] [ 6 get 8 get edge-live-in ] unit-test \ No newline at end of file diff --git a/basis/compiler/cfg/save-contexts/save-contexts-tests.factor b/basis/compiler/cfg/save-contexts/save-contexts-tests.factor index e074d95b1a..ad89abb97f 100644 --- a/basis/compiler/cfg/save-contexts/save-contexts-tests.factor +++ b/basis/compiler/cfg/save-contexts/save-contexts-tests.factor @@ -62,3 +62,20 @@ V{ ] [ 0 get instructions>> ] unit-test + +V{ + T{ ##phi } + T{ ##add } +} 0 test-bb + +0 get insert-save-context + +[ + V{ + T{ ##phi } + T{ ##save-context f 7 8 } + T{ ##add } + } +] [ + 0 get instructions>> +] unit-test diff --git a/basis/compiler/cfg/save-contexts/save-contexts.factor b/basis/compiler/cfg/save-contexts/save-contexts.factor index e20cb68020..57691f1a4e 100644 --- a/basis/compiler/cfg/save-contexts/save-contexts.factor +++ b/basis/compiler/cfg/save-contexts/save-contexts.factor @@ -18,6 +18,7 @@ M: insn needs-save-context? drop f ; GENERIC: modifies-context? ( insn -- ? ) +M: ##phi modifies-context? drop t ; M: ##inc-d modifies-context? drop t ; M: ##inc-r modifies-context? drop t ; M: ##callback-inputs modifies-context? drop t ;