compiler.cfg.value-numbering: remove constant -vs- literal distinction
parent
9cea3f2c93
commit
f548a08637
|
@ -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
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 <copy> ] [ drop f ] if ;
|
||||
|
||||
! ##box-displaced-alien f 1 2 3 <class>
|
||||
|
@ -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 )
|
||||
|
|
|
@ -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 )
|
||||
{
|
||||
|
|
|
@ -14,9 +14,7 @@ TUPLE: integer-expr < expr value ;
|
|||
|
||||
C: <integer-expr> 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>> <integer-expr> ;
|
|||
|
||||
M: ##load-reference >expr obj>> <reference-expr> ;
|
||||
|
||||
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 [ [ <integer-expr> ] ] }
|
||||
{ tagged-rep [ [ <reference-expr> ] ] }
|
||||
} 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 ;
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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 ;
|
||||
|
|
|
@ -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* <copy> ] }
|
||||
{ [ dup vector>scalar-expr? ] [ [ dst>> ] [ src>> vn>vreg ] bi* <copy> ] }
|
||||
[ 2drop f ]
|
||||
} cond ;
|
||||
|
||||
|
|
|
@ -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 ;
|
||||
|
||||
|
|
Loading…
Reference in New Issue