diff --git a/basis/compiler/cfg/instructions/instructions.factor b/basis/compiler/cfg/instructions/instructions.factor index 3a4de986ad..13c9f55b9f 100644 --- a/basis/compiler/cfg/instructions/instructions.factor +++ b/basis/compiler/cfg/instructions/instructions.factor @@ -23,20 +23,20 @@ TUPLE: pure-insn < insn ; ! Constants INSN: ##load-integer def: dst/int-rep -constant: val/int-rep ; +literal: val ; INSN: ##load-reference def: dst/tagged-rep -constant: obj/tagged-rep ; +literal: obj ; ! These two are inserted by representation selection INSN: ##load-tagged def: dst/tagged-rep -constant: val/tagged-rep ; +literal: val ; INSN: ##load-double def: dst/double-rep -constant: val/double-rep ; +literal: val ; ! Stack operations INSN: ##peek @@ -113,7 +113,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##add-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##sub def: dst/int-rep @@ -122,7 +122,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##sub-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##mul def: dst/int-rep @@ -131,7 +131,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##mul-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##and def: dst/int-rep @@ -140,7 +140,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##and-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##or def: dst/int-rep @@ -149,7 +149,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##or-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##xor def: dst/int-rep @@ -158,7 +158,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##xor-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##shl def: dst/int-rep @@ -167,7 +167,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##shl-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##shr def: dst/int-rep @@ -176,7 +176,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##shr-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##sar def: dst/int-rep @@ -185,7 +185,7 @@ use: src1/int-rep src2/int-rep ; PURE-INSN: ##sar-imm def: dst/int-rep use: src1/int-rep -constant: src2/int-rep ; +literal: src2 ; PURE-INSN: ##min def: dst/int-rep @@ -629,8 +629,7 @@ literal: cc ; INSN: ##compare-imm-branch use: src1/tagged-rep -constant: src2/tagged-rep -literal: cc ; +literal: src2 cc ; PURE-INSN: ##compare def: dst/tagged-rep @@ -641,8 +640,7 @@ temp: temp/int-rep ; PURE-INSN: ##compare-imm def: dst/tagged-rep use: src1/tagged-rep -constant: src2/tagged-rep -literal: cc +literal: src2 cc temp: temp/int-rep ; ! Integer conditionals @@ -652,8 +650,7 @@ literal: cc ; INSN: ##compare-integer-imm-branch use: src1/int-rep -constant: src2/int-rep -literal: cc ; +literal: src2 cc ; PURE-INSN: ##compare-integer def: dst/tagged-rep @@ -664,8 +661,7 @@ temp: temp/int-rep ; PURE-INSN: ##compare-integer-imm def: dst/tagged-rep use: src1/int-rep -constant: src2/int-rep -literal: cc +literal: src2 cc temp: temp/int-rep ; ! Float conditionals @@ -739,8 +735,7 @@ literal: cc ; INSN: _compare-imm-branch literal: label use: src1 -constant: src2 -literal: cc ; +literal: src2 cc ; INSN: _compare-float-unordered-branch literal: label diff --git a/basis/compiler/cfg/instructions/syntax/syntax.factor b/basis/compiler/cfg/instructions/syntax/syntax.factor index afca252bdc..7b8327cf06 100644 --- a/basis/compiler/cfg/instructions/syntax/syntax.factor +++ b/basis/compiler/cfg/instructions/syntax/syntax.factor @@ -5,7 +5,7 @@ make fry sequences parser accessors effects namespaces combinators splitting classes.parser lexer quotations ; IN: compiler.cfg.instructions.syntax -SYMBOLS: def use temp literal constant ; +SYMBOLS: def use temp literal ; SYMBOL: scalar-rep @@ -31,7 +31,6 @@ TUPLE: insn-slot-spec type name rep ; { "use:" [ drop use ] } { "temp:" [ drop temp ] } { "literal:" [ drop literal ] } - { "constant:" [ drop constant ] } [ dupd parse-insn-slot-spec , ] } case ] reduce drop diff --git a/basis/compiler/cfg/value-numbering/alien/alien.factor b/basis/compiler/cfg/value-numbering/alien/alien.factor index 9fc1405f6c..cdb56aa9d1 100644 --- a/basis/compiler/cfg/value-numbering/alien/alien.factor +++ b/basis/compiler/cfg/value-numbering/alien/alien.factor @@ -13,7 +13,7 @@ compiler.cfg.value-numbering.rewrite ; IN: compiler.cfg.value-numbering.alien M: ##box-displaced-alien rewrite - dup displacement>> vreg>expr expr-zero? + dup displacement>> vreg>expr zero-expr? [ [ dst>> ] [ base>> ] bi ] [ drop f ] if ; ! ##box-displaced-alien f 1 2 3 @@ -53,7 +53,7 @@ M: ##unbox-alien rewrite rewrite-unbox-any-c-ptr ; : fuse-base-offset ( insn -- insn' ) dup base>> vreg>expr - [ src1>> vn>vreg ] [ src2>> vn>integer ] bi + [ src1>> vn>vreg ] [ src2>> ] bi [ >>base ] [ '[ _ + ] change-offset ] bi* ; ! Fuse ##add-imm into ##load-memory and ##store-memory @@ -63,7 +63,7 @@ M: ##unbox-alien rewrite rewrite-unbox-any-c-ptr ; : fuse-displacement-offset ( insn -- insn' ) dup displacement>> vreg>expr - [ src1>> vn>vreg ] [ src2>> vn>integer ] bi + [ src1>> vn>vreg ] [ src2>> ] bi [ >>displacement ] [ '[ _ + ] change-offset ] bi* ; ! Fuse ##add into ##load-memory-imm and ##store-memory-imm @@ -95,14 +95,14 @@ M: ##store-memory-imm new-alien-insn drop \ ##store-memory new-insn ; ! Fuse ##shl-imm into ##load-memory or ##store-memory : scale-expr? ( expr -- ? ) - { [ shl-imm-expr? ] [ src2>> vn>integer { 1 2 3 } member? ] } 1&& ; + { [ shl-imm-expr? ] [ src2>> { 1 2 3 } member? ] } 1&& ; : fuse-scale? ( insn -- ? ) { [ scale>> 0 = ] [ displacement>> vreg>expr scale-expr? ] } 1&& ; : fuse-scale ( insn -- insn' ) dup displacement>> vreg>expr - [ src1>> vn>vreg ] [ src2>> vn>integer ] bi + [ src1>> vn>vreg ] [ src2>> ] bi [ >>displacement ] [ >>scale ] bi* ; : rewrite-memory-op ( insn -- insn/f ) diff --git a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor index 43a04a999b..eb6d72f512 100644 --- a/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor +++ b/basis/compiler/cfg/value-numbering/comparisons/comparisons.factor @@ -39,13 +39,13 @@ IN: compiler.cfg.value-numbering.comparisons [ src1>> vn>vreg ] [ src2>> vn>vreg ] [ cc>> ] tri ; inline : >compare-imm-expr< ( expr -- in1 in2 cc ) - [ src1>> vn>vreg ] [ src2>> vn>comparand ] [ cc>> ] tri ; inline + [ src1>> vn>vreg ] [ src2>> ] [ cc>> ] tri ; inline : >compare-integer-expr< ( expr -- in1 in2 cc ) [ src1>> vn>vreg ] [ src2>> vn>vreg ] [ cc>> ] tri ; inline : >compare-integer-imm-expr< ( expr -- in1 in2 cc ) - [ src1>> vn>vreg ] [ src2>> vn>integer ] [ cc>> ] tri ; inline + [ src1>> vn>vreg ] [ src2>> ] [ cc>> ] tri ; inline : >test-vector-expr< ( expr -- src1 temp rep vcc ) { diff --git a/basis/compiler/cfg/value-numbering/expressions/expressions.factor b/basis/compiler/cfg/value-numbering/expressions/expressions.factor index 78097b1635..b7b7155285 100644 --- a/basis/compiler/cfg/value-numbering/expressions/expressions.factor +++ b/basis/compiler/cfg/value-numbering/expressions/expressions.factor @@ -14,9 +14,7 @@ TUPLE: integer-expr < expr value ; C: integer-expr -: expr-zero? ( expr -- ? ) T{ integer-expr f 0 } = ; inline -: expr-one? ( expr -- ? ) T{ integer-expr f 1 } = ; inline -: expr-neg-one? ( expr -- ? ) T{ integer-expr f -1 } = ; inline +: zero-expr? ( expr -- ? ) T{ integer-expr f 0 } = ; inline TUPLE: reference-expr < expr value ; @@ -44,14 +42,6 @@ M: ##load-integer >expr val>> ; M: ##load-reference >expr obj>> ; -GENERIC: expr>reference ( expr -- obj ) - -M: reference-expr expr>reference value>> ; - -: vn>reference ( vn -- obj ) vn>expr expr>reference ; - -: vreg>reference ( vreg -- obj ) vreg>vn vn>reference ; inline - GENERIC: expr>integer ( expr -- n ) M: integer-expr expr>integer value>> ; @@ -92,7 +82,7 @@ M: reference-expr expr>comparand value>> ; << : input-values ( slot-specs -- slot-specs' ) - [ type>> { use literal constant } member-eq? ] filter ; + [ type>> { use literal } member-eq? ] filter ; : expr-class ( insn -- expr ) name>> "##" ?head drop "-expr" append create-class-in ; @@ -100,20 +90,13 @@ M: reference-expr expr>comparand value>> ; : define-expr-class ( expr slot-specs -- ) [ expr ] dip [ name>> ] map define-tuple-class ; -: constant-quot ( rep -- quot ) - { - { int-rep [ [ ] ] } - { tagged-rep [ [ ] ] } - } case [ expr>vn ] append ; - : >expr-quot ( expr slot-specs -- quot ) [ [ name>> reader-word 1quotation ] [ - [ rep>> ] [ type>> ] bi { - { use [ drop [ vreg>vn ] ] } - { literal [ drop [ ] ] } - { constant [ constant-quot ] } + type>> { + { use [ [ vreg>vn ] ] } + { literal [ [ ] ] } } case ] bi append ] map cleave>quot swap suffix \ boa suffix ; diff --git a/basis/compiler/cfg/value-numbering/graph/graph.factor b/basis/compiler/cfg/value-numbering/graph/graph.factor index 8ba09b125d..0e9dcb6076 100644 --- a/basis/compiler/cfg/value-numbering/graph/graph.factor +++ b/basis/compiler/cfg/value-numbering/graph/graph.factor @@ -3,9 +3,10 @@ USING: accessors kernel math namespaces assocs biassocs ; IN: compiler.cfg.value-numbering.graph +! Value numbers are negative, to catch confusion with vregs SYMBOL: vn-counter -: next-vn ( -- vn ) vn-counter [ dup 1 + ] change ; +: next-vn ( -- vn ) vn-counter [ 1 - dup ] change ; ! biassoc mapping expressions to value numbers SYMBOL: exprs>vns diff --git a/basis/compiler/cfg/value-numbering/math/math.factor b/basis/compiler/cfg/value-numbering/math/math.factor index 498ca946f5..219aa82795 100644 --- a/basis/compiler/cfg/value-numbering/math/math.factor +++ b/basis/compiler/cfg/value-numbering/math/math.factor @@ -10,7 +10,7 @@ compiler.cfg.value-numbering.graph compiler.cfg.value-numbering.rewrite ; IN: compiler.cfg.value-numbering.math -: f-expr? ( expr -- ? ) T{ reference-expr f f } = ; +: f-expr? ( expr -- ? ) T{ reference-expr f f } = ; inline M: ##tagged>integer rewrite [ dst>> ] [ src>> vreg>expr ] bi { @@ -49,7 +49,7 @@ M: ##not rewrite : (reassociate) ( insn -- dst src1 src2' src2'' ) { [ dst>> ] - [ src1>> vreg>expr [ src1>> vn>vreg ] [ src2>> vn>integer ] bi ] + [ src1>> vreg>expr [ src1>> vn>vreg ] [ src2>> ] bi ] [ src2>> ] } cleave ; inline @@ -122,7 +122,7 @@ M: ##sub-imm rewrite sub-imm>add-imm ; : distribute ( insn add-op mul-op -- new-insns/f ) [ dup src1>> vreg>expr - 2dup src2>> vn>integer swap [ src2>> ] keep binary-constant-fold* + 2dup src2>> swap [ src2>> ] keep binary-constant-fold* next-vreg ] 2dip (distribute) ; inline @@ -220,7 +220,7 @@ M: ##add rewrite ! => ! ##neg 3 2 : sub-to-neg? ( ##sub -- ? ) - src1>> vn>expr expr-zero? ; + src1>> vreg>expr zero-expr? ; : sub-to-neg ( ##sub -- insn ) [ dst>> ] [ src2>> ] bi \ ##neg new-insn ; diff --git a/basis/compiler/cfg/value-numbering/simd/simd.factor b/basis/compiler/cfg/value-numbering/simd/simd.factor index 940e0d5acb..6d39a29c14 100644 --- a/basis/compiler/cfg/value-numbering/simd/simd.factor +++ b/basis/compiler/cfg/value-numbering/simd/simd.factor @@ -59,7 +59,7 @@ M: ##shuffle-vector-imm rewrite M: ##scalar>vector rewrite dup src>> vreg>expr { { [ dup reference-expr? ] [ fold-scalar>vector ] } - { [ dup vector>scalar-expr? ] [ [ dst>> ] [ src>> ] bi* ] } + { [ dup vector>scalar-expr? ] [ [ dst>> ] [ src>> vn>vreg ] bi* ] } [ 2drop f ] } cond ; diff --git a/basis/compiler/cfg/value-numbering/slots/slots.factor b/basis/compiler/cfg/value-numbering/slots/slots.factor index 0549765072..21dac9dcfb 100644 --- a/basis/compiler/cfg/value-numbering/slots/slots.factor +++ b/basis/compiler/cfg/value-numbering/slots/slots.factor @@ -16,7 +16,7 @@ IN: compiler.cfg.value-numbering.slots dup simplify-slot-addressing? [ dup slot>> vreg>expr [ src1>> vn>vreg >>slot ] - [ src2>> vn>integer over scale>> '[ _ _ shift - ] change-tag ] + [ src2>> over scale>> '[ _ _ shift - ] change-tag ] bi ] [ drop f ] if ;