compiler.cfg.value-numbering: remove constant -vs- literal distinction

db4
Slava Pestov 2010-04-24 04:49:35 -04:00
parent 9cea3f2c93
commit f548a08637
9 changed files with 39 additions and 61 deletions

View File

@ -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

View File

@ -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

View File

@ -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 )

View File

@ -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 )
{

View File

@ -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 ;

View File

@ -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

View File

@ -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 ;

View File

@ -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 ;

View File

@ -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 ;