From 428ba9fd0f085027c267f89717ae4e04b8810e13 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Sat, 1 May 2010 03:04:31 -0400 Subject: [PATCH] compiler.cfg: fuse ##load-integer/##load-reference into ##replace to form ##replace-imm --- .../cfg/instructions/instructions.factor | 3 +++ .../stacks/uninitialized/uninitialized.factor | 11 ++++++++--- .../comparisons/comparisons.factor | 8 +++----- .../cfg/value-numbering/misc/authors.txt | 1 + .../cfg/value-numbering/misc/misc.factor | 13 +++++++++++++ .../cfg/value-numbering/rewrite/rewrite.factor | 14 ++++++++------ .../cfg/value-numbering/value-numbering.factor | 1 + basis/compiler/codegen/codegen.factor | 5 +++-- .../propagation/known-words/known-words.factor | 12 +++++++----- basis/cpu/architecture/architecture.factor | 3 +++ basis/cpu/x86/32/32.factor | 13 ++++++++++--- basis/cpu/x86/x86.factor | 16 +++++++++++++--- 12 files changed, 73 insertions(+), 27 deletions(-) create mode 100644 basis/compiler/cfg/value-numbering/misc/authors.txt create mode 100644 basis/compiler/cfg/value-numbering/misc/misc.factor diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index e7a8338d91..e483b707ae 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -51,6 +51,9 @@ INSN: ##replace use: src/tagged-rep literal: loc ; +INSN: ##replace-imm +literal: src loc ; + INSN: ##inc-d literal: n ; diff --git a/basis/compiler/cfg/stacks/uninitialized/uninitialized.factor b/basis/compiler/cfg/stacks/uninitialized/uninitialized.factor index 5b2bbf3765..3d7519e14b 100644 --- a/basis/compiler/cfg/stacks/uninitialized/uninitialized.factor +++ b/basis/compiler/cfg/stacks/uninitialized/uninitialized.factor @@ -33,14 +33,19 @@ M: ##inc-r visit-insn n>> rs-loc handle-inc ; ERROR: uninitialized-peek insn ; -M: ##peek visit-insn +: visit-peek ( ##peek -- ) dup loc>> [ n>> ] [ class get ] bi ?nth 0 = - [ uninitialized-peek ] [ drop ] if ; + [ uninitialized-peek ] [ drop ] if ; inline -M: ##replace visit-insn +M: ##peek visit-insn visit-peek ; + +: visit-replace ( ##replace -- ) loc>> [ n>> ] [ class get ] bi 2dup length < [ [ 1 ] 2dip set-nth ] [ 2drop ] if ; +M: ##replace visit-insn visit-replace ; +M: ##replace-imm visit-insn visit-replace ; + M: insn visit-insn drop ; : prepare ( pair -- ) diff --git a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor index 63ac3575ef..f28092d8cc 100644 --- a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor +++ b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor @@ -17,13 +17,11 @@ IN: compiler.cfg.value-numbering.comparisons ! 3) Folding comparisons where both inputs are congruent ! 4) Converting compare instructions into compare-imm instructions -UNION: literal-insn ##load-integer ##load-reference ; - : fold-compare-imm? ( insn -- ? ) src1>> vreg>insn literal-insn? ; : evaluate-compare-imm ( insn -- ? ) - [ src1>> vreg>comparand ] [ src2>> ] [ cc>> ] tri + [ src1>> vreg>literal ] [ src2>> ] [ cc>> ] tri { { cc= [ eq? ] } { cc/= [ eq? not ] } @@ -107,7 +105,7 @@ M: ##compare-integer-imm-branch rewrite : >compare-imm-branch ( insn swap? -- insn' ) (>compare-imm-branch) - [ vreg>comparand ] dip + [ vreg>literal ] dip \ ##compare-imm-branch new-insn ; inline : >compare-integer-imm-branch ( insn swap? -- insn' ) @@ -143,7 +141,7 @@ M: ##compare-integer-branch rewrite : >compare-imm ( insn swap? -- insn' ) (>compare-imm) - [ vreg>comparand ] dip + [ vreg>literal ] dip next-vreg \ ##compare-imm new-insn ; inline : >compare-integer-imm ( insn swap? -- insn' ) diff --git a/basis/compiler/cfg/value-numbering/misc/authors.txt b/basis/compiler/cfg/value-numbering/misc/authors.txt new file mode 100644 index 0000000000..1901f27a24 --- /dev/null +++ b/basis/compiler/cfg/value-numbering/misc/authors.txt @@ -0,0 +1 @@ +Slava Pestov diff --git a/basis/compiler/cfg/value-numbering/misc/misc.factor b/basis/compiler/cfg/value-numbering/misc/misc.factor new file mode 100644 index 0000000000..e608c6e4ce --- /dev/null +++ b/basis/compiler/cfg/value-numbering/misc/misc.factor @@ -0,0 +1,13 @@ +! Copyright (C) 2010 Slava Pestov. +! See http://factorcode.org/license.txt for BSD license. +USING: accessors compiler.cfg.instructions +compiler.cfg.value-numbering.graph +compiler.cfg.value-numbering.rewrite cpu.architecture kernel ; +IN: compiler.cfg.value-numbering.misc + +M: ##replace rewrite + object-immediates? [ + [ loc>> ] [ src>> vreg>insn ] bi dup literal-insn? + [ insn>literal swap \ ##replace-imm new-insn ] + [ 2drop f ] if + ] [ drop f ] if ; diff --git a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor index 1e2327d765..4f22c5bec2 100644 --- a/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor +++ b/basis/compiler/cfg/value-numbering/rewrite/rewrite.factor @@ -1,7 +1,7 @@ ! Copyright (C) 2010 Slava Pestov. ! See http://factorcode.org/license.txt for BSD license. -USING: accessors combinators combinators.short-circuit kernel layouts -cpu.architecture +USING: accessors combinators combinators.short-circuit kernel +layouts math cpu.architecture compiler.cfg.instructions compiler.cfg.value-numbering.graph ; IN: compiler.cfg.value-numbering.rewrite @@ -30,13 +30,15 @@ M: ##load-integer insn>integer val>> ; [ val>> immediate-bitwise? ] } 1&& ; -GENERIC: insn>comparand ( expr -- n ) +UNION: literal-insn ##load-integer ##load-reference ; -M: ##load-integer insn>comparand val>> tag-fixnum ; +GENERIC: insn>literal ( insn -- n ) -M: ##load-reference insn>comparand obj>> ; +M: ##load-integer insn>literal val>> >fixnum ; -: vreg>comparand ( vreg -- n ) vreg>insn insn>comparand ; inline +M: ##load-reference insn>literal obj>> ; + +: vreg>literal ( vreg -- n ) vreg>insn insn>literal ; inline : vreg-immediate-comparand? ( vreg -- ? ) vreg>insn { diff --git a/basis/compiler/cfg/value-numbering/value-numbering.factor b/basis/compiler/cfg/value-numbering/value-numbering.factor index 81e9d53bad..23fae4932e 100644 --- a/basis/compiler/cfg/value-numbering/value-numbering.factor +++ b/basis/compiler/cfg/value-numbering/value-numbering.factor @@ -15,6 +15,7 @@ compiler.cfg.value-numbering.graph compiler.cfg.value-numbering.math compiler.cfg.value-numbering.rewrite compiler.cfg.value-numbering.slots +compiler.cfg.value-numbering.misc compiler.cfg.value-numbering.expressions ; IN: compiler.cfg.value-numbering diff --git a/basis/compiler/codegen/codegen.factor b/basis/compiler/codegen/codegen.factor index 3d0a6ee8af..4737f1a47d 100755 --- a/basis/compiler/codegen/codegen.factor +++ b/basis/compiler/codegen/codegen.factor @@ -81,6 +81,7 @@ CODEGEN: ##load-double %load-double CODEGEN: ##load-vector %load-vector CODEGEN: ##peek %peek CODEGEN: ##replace %replace +CODEGEN: ##replace-imm %replace-imm CODEGEN: ##inc-d %inc-d CODEGEN: ##inc-r %inc-r CODEGEN: ##call %call @@ -193,7 +194,7 @@ CODEGEN: ##write-barrier-imm %write-barrier-imm CODEGEN: ##compare %compare CODEGEN: ##compare-imm %compare-imm CODEGEN: ##compare-integer %compare -CODEGEN: ##compare-integer-imm %compare-imm +CODEGEN: ##compare-integer-imm %compare-integer-imm CODEGEN: ##compare-float-ordered %compare-float-ordered CODEGEN: ##compare-float-unordered %compare-float-unordered CODEGEN: ##save-context %save-context @@ -227,7 +228,7 @@ SYNTAX: CONDITIONAL: CONDITIONAL: ##compare-branch %compare-branch CONDITIONAL: ##compare-imm-branch %compare-imm-branch CONDITIONAL: ##compare-integer-branch %compare-branch -CONDITIONAL: ##compare-integer-imm-branch %compare-imm-branch +CONDITIONAL: ##compare-integer-imm-branch %compare-integer-imm-branch CONDITIONAL: ##compare-float-ordered-branch %compare-float-ordered-branch CONDITIONAL: ##compare-float-unordered-branch %compare-float-unordered-branch CONDITIONAL: ##test-vector-branch %test-vector-branch diff --git a/basis/compiler/tree/propagation/known-words/known-words.factor b/basis/compiler/tree/propagation/known-words/known-words.factor index ada01e213a..351da4e2f8 100644 --- a/basis/compiler/tree/propagation/known-words/known-words.factor +++ b/basis/compiler/tree/propagation/known-words/known-words.factor @@ -221,12 +221,14 @@ generic-comparison-ops [ ] "outputs" set-word-prop \ both-fixnums? [ - [ class>> ] bi@ { - { [ 2dup [ fixnum classes-intersect? not ] either? ] [ f ] } - { [ 2dup [ fixnum class<= ] both? ] [ t ] } - [ object-info ] + node-input-infos first2 [ class>> ] bi@ { + { [ 2dup [ fixnum classes-intersect? not ] either? ] [ [ 2drop f ] ] } + { [ 2dup [ fixnum class<= ] both? ] [ [ 2drop t ] ] } + { [ dup fixnum class<= ] [ [ drop fixnum? ] ] } + { [ over fixnum class<= ] [ [ nip fixnum? ] ] } + [ f ] } cond 2nip -] "outputs" set-word-prop +] "custom-inlining" set-word-prop { { >fixnum fixnum } diff --git a/basis/cpu/architecture/architecture.factor b/basis/cpu/architecture/architecture.factor index 1418ab90b6..cac7ea4d7a 100644 --- a/basis/cpu/architecture/architecture.factor +++ b/basis/cpu/architecture/architecture.factor @@ -229,6 +229,7 @@ HOOK: %load-vector cpu ( reg val rep -- ) HOOK: %peek cpu ( vreg loc -- ) HOOK: %replace cpu ( vreg loc -- ) +HOOK: %replace-imm cpu ( src loc -- ) HOOK: %inc-d cpu ( n -- ) HOOK: %inc-r cpu ( n -- ) @@ -472,11 +473,13 @@ HOOK: %epilogue cpu ( n -- ) HOOK: %compare cpu ( dst temp cc src1 src2 -- ) HOOK: %compare-imm cpu ( dst temp cc src1 src2 -- ) +HOOK: %compare-integer-imm cpu ( dst temp cc src1 src2 -- ) HOOK: %compare-float-ordered cpu ( dst temp cc src1 src2 -- ) HOOK: %compare-float-unordered cpu ( dst temp cc src1 src2 -- ) HOOK: %compare-branch cpu ( label cc src1 src2 -- ) HOOK: %compare-imm-branch cpu ( label cc src1 src2 -- ) +HOOK: %compare-integer-imm-branch cpu ( label cc src1 src2 -- ) HOOK: %compare-float-ordered-branch cpu ( label cc src1 src2 -- ) HOOK: %compare-float-unordered-branch cpu ( label cc src1 src2 -- ) diff --git a/basis/cpu/x86/32/32.factor b/basis/cpu/x86/32/32.factor index 4df4fbd602..6a7ecd9d14 100755 --- a/basis/cpu/x86/32/32.factor +++ b/basis/cpu/x86/32/32.factor @@ -24,11 +24,18 @@ M: x86.32 stack-reg ESP ; M: x86.32 frame-reg EBP ; M: x86.32 temp-reg ECX ; -M: x86.32 immediate-comparand? ( n -- ? ) - [ call-next-method ] [ word? ] bi or ; - M: x86.32 object-immediates? ( -- ? ) t ; +M: x86.32 immediate-comparand? ( obj -- ? ) drop t ; + +M: x86.32 %replace-imm ( src loc -- ) + loc>operand swap + { + { [ dup not ] [ drop \ f type-number MOV ] } + { [ dup fixnum? ] [ tag-fixnum MOV ] } + [ [ HEX: ffffffff MOV ] dip rc-absolute rel-literal ] + } cond ; + M: x86.32 %load-double ( dst val -- ) [ 0 [] MOVSD ] dip rc-absolute rel-float ; diff --git a/basis/cpu/x86/x86.factor b/basis/cpu/x86/x86.factor index 619fb2d3ec..6c485e1630 100644 --- a/basis/cpu/x86/x86.factor +++ b/basis/cpu/x86/x86.factor @@ -531,12 +531,18 @@ M:: x86 %compare ( dst src1 src2 cc temp -- ) : (%compare-tagged) ( src1 src2 -- ) [ HEX: ffffffff CMP ] dip rc-absolute rel-literal ; +: (%compare-integer-imm) ( src1 src2 cc -- ) + 3dup use-test? [ 2drop dup TEST ] [ drop CMP ] if ; + +M:: x86 %compare-integer-imm ( dst src1 src2 cc temp -- ) + src1 src2 cc (%compare-integer-imm) + dst cc temp %boolean ; + : (%compare-imm) ( src1 src2 cc -- ) { - { [ 3dup use-test? ] [ 2drop dup TEST ] } - { [ over integer? ] [ drop CMP ] } - { [ over word? ] [ drop (%compare-tagged) ] } + { [ over fixnum? ] [ [ tag-fixnum ] dip (%compare-integer-imm) ] } { [ over not ] [ 2drop \ f type-number CMP ] } + [ drop (%compare-tagged) ] } cond ; M:: x86 %compare-imm ( dst src1 src2 cc temp -- ) @@ -557,6 +563,10 @@ M:: x86 %compare-branch ( label src1 src2 cc -- ) src1 src2 CMP label cc %branch ; +M:: x86 %compare-integer-imm-branch ( label src1 src2 cc -- ) + src1 src2 cc (%compare-integer-imm) + label cc %branch ; + M:: x86 %compare-imm-branch ( label src1 src2 cc -- ) src1 src2 cc (%compare-imm) label cc %branch ;