compiler.cfg: remove _gc instruction, it doesn't need to exist, and change GC checks to ensure that the right amount of space is available instead of blindly checking for 1Kb

db4
Slava Pestov 2009-10-05 05:27:49 -05:00
parent 718cb8b579
commit b4e36608da
13 changed files with 40 additions and 45 deletions

View File

@ -25,7 +25,7 @@ M: stack-frame-insn compute-stack-frame*
M: ##call compute-stack-frame* M: ##call compute-stack-frame*
word>> sub-primitive>> [ frame-required? on ] unless ; word>> sub-primitive>> [ frame-required? on ] unless ;
M: _gc compute-stack-frame* M: ##gc compute-stack-frame*
frame-required? on frame-required? on
stack-frame new swap tagged-values>> length cells >>gc-root-size stack-frame new swap tagged-values>> length cells >>gc-root-size
request-stack-frame ; request-stack-frame ;

View File

@ -1,7 +1,7 @@
! Copyright (C) 2009 Slava Pestov. ! Copyright (C) 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel sequences assocs fry USING: accessors kernel sequences assocs fry
cpu.architecture cpu.architecture layouts
compiler.cfg.rpo compiler.cfg.rpo
compiler.cfg.registers compiler.cfg.registers
compiler.cfg.instructions compiler.cfg.instructions
@ -17,11 +17,26 @@ IN: compiler.cfg.gc-checks
: blocks-with-gc ( cfg -- bbs ) : blocks-with-gc ( cfg -- bbs )
post-order [ insert-gc-check? ] filter ; post-order [ insert-gc-check? ] filter ;
GENERIC: allocation-size* ( insn -- n )
M: ##allot allocation-size* size>> ;
M: ##box-alien allocation-size* drop 4 cells ;
M: ##box-displaced-alien allocation-size* drop 4 cells ;
: allocation-size ( bb -- n )
instructions>> [ ##allocation? ] filter [ allocation-size* ] sigma ;
: insert-gc-check ( bb -- ) : insert-gc-check ( bb -- )
dup '[ dup dup '[
int-rep next-vreg-rep int-rep next-vreg-rep
int-rep next-vreg-rep int-rep next-vreg-rep
f f _ uninitialized-locs \ ##gc new-insn _ allocation-size
f
f
_ uninitialized-locs
\ ##gc new-insn
prefix prefix
] change-instructions drop ; ] change-instructions drop ;

View File

@ -672,7 +672,7 @@ use: src1/int-rep src2/int-rep ;
INSN: ##gc INSN: ##gc
temp: temp1/int-rep temp2/int-rep temp: temp1/int-rep temp2/int-rep
literal: data-values tagged-values uninitialized-locs ; literal: size data-values tagged-values uninitialized-locs ;
INSN: ##save-context INSN: ##save-context
temp: temp1/int-rep temp2/int-rep temp: temp1/int-rep temp2/int-rep
@ -740,10 +740,6 @@ use: src1/int-rep src2/int-rep ;
TUPLE: spill-slot { n integer } ; TUPLE: spill-slot { n integer } ;
C: <spill-slot> spill-slot C: <spill-slot> spill-slot
INSN: _gc
temp: temp1 temp2
literal: data-values tagged-values uninitialized-locs ;
! These instructions operate on machine registers and not ! These instructions operate on machine registers and not
! virtual registers ! virtual registers
INSN: _spill INSN: _spill

View File

@ -55,6 +55,9 @@ IN: compiler.cfg.intrinsics.allot
] [ node emit-primitive ] if ] [ node emit-primitive ] if
] ; ] ;
: expand-(byte-array)? ( obj -- ? )
dup integer? [ 0 1024 between? ] [ drop f ] if ;
: expand-<byte-array>? ( obj -- ? ) : expand-<byte-array>? ( obj -- ? )
dup integer? [ 0 32 between? ] [ drop f ] if ; dup integer? [ 0 32 between? ] [ drop f ] if ;
@ -69,7 +72,7 @@ IN: compiler.cfg.intrinsics.allot
[ byte-array store-length ] [ ds-push ] [ ] tri ; [ byte-array store-length ] [ ds-push ] [ ] tri ;
: emit-(byte-array) ( node -- ) : emit-(byte-array) ( node -- )
dup node-input-infos first literal>> dup expand-<byte-array>? dup node-input-infos first literal>> dup expand-(byte-array)?
[ nip emit-allot-byte-array drop ] [ drop emit-primitive ] if ; [ nip emit-allot-byte-array drop ] [ drop emit-primitive ] if ;
:: emit-<byte-array> ( node -- ) :: emit-<byte-array> ( node -- )

View File

@ -2,7 +2,7 @@
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel math assocs namespaces sequences heaps USING: accessors kernel math assocs namespaces sequences heaps
fry make combinators sets locals arrays fry make combinators sets locals arrays
cpu.architecture cpu.architecture layouts
compiler.cfg compiler.cfg
compiler.cfg.def-use compiler.cfg.def-use
compiler.cfg.liveness compiler.cfg.liveness
@ -117,8 +117,6 @@ RENAMING: assign [ vreg>reg ] [ vreg>reg ] [ vreg>reg ]
M: vreg-insn assign-registers-in-insn M: vreg-insn assign-registers-in-insn
[ assign-insn-defs ] [ assign-insn-uses ] [ assign-insn-temps ] tri ; [ assign-insn-defs ] [ assign-insn-uses ] [ assign-insn-temps ] tri ;
! TODO: needs tagged-rep
: trace-on-gc ( assoc -- assoc' ) : trace-on-gc ( assoc -- assoc' )
! When a GC occurs, virtual registers which contain tagged data ! When a GC occurs, virtual registers which contain tagged data
! are traced by the GC. Outputs a sequence physical registers. ! are traced by the GC. Outputs a sequence physical registers.
@ -141,12 +139,16 @@ M: vreg-insn assign-registers-in-insn
] assoc-each ] assoc-each
] { } make ; ] { } make ;
: gc-root-offsets ( registers -- alist )
! Outputs a sequence of { offset register/spill-slot } pairs
[ length iota [ cell * ] map ] keep zip ;
M: ##gc assign-registers-in-insn M: ##gc assign-registers-in-insn
! Since ##gc is always the first instruction in a block, the set of ! Since ##gc is always the first instruction in a block, the set of
! values live at the ##gc is just live-in. ! values live at the ##gc is just live-in.
dup call-next-method dup call-next-method
basic-block get register-live-ins get at basic-block get register-live-ins get at
[ trace-on-gc >>tagged-values ] [ spill-on-gc >>data-values ] bi [ trace-on-gc gc-root-offsets >>tagged-values ] [ spill-on-gc >>data-values ] bi
drop ; drop ;
M: insn assign-registers-in-insn drop ; M: insn assign-registers-in-insn drop ;

View File

@ -97,21 +97,6 @@ M: ##dispatch linearize-insn
[ successors>> [ block-number _dispatch-label ] each ] [ successors>> [ block-number _dispatch-label ] each ]
bi* ; bi* ;
: gc-root-offsets ( registers -- alist )
! Outputs a sequence of { offset register/spill-slot } pairs
[ length iota [ cell * ] map ] keep zip ;
M: ##gc linearize-insn
nip
{
[ temp1>> ]
[ temp2>> ]
[ data-values>> ]
[ tagged-values>> gc-root-offsets ]
[ uninitialized-locs>> ]
} cleave
_gc ;
: linearize-basic-blocks ( cfg -- insns ) : linearize-basic-blocks ( cfg -- insns )
[ [
[ [

View File

@ -9,7 +9,7 @@ IN: compiler.cfg.stacks.uninitialized
! Consider the following sequence of instructions: ! Consider the following sequence of instructions:
! ##inc-d 2 ! ##inc-d 2
! _gc ! ##gc
! ##replace ... D 0 ! ##replace ... D 0
! ##replace ... D 1 ! ##replace ... D 1
! The GC check runs before stack locations 0 and 1 have been initialized, ! The GC check runs before stack locations 0 and 1 have been initialized,

View File

@ -271,10 +271,10 @@ M: object load-gc-root drop %load-gc-root ;
: load-data-regs ( data-regs -- ) [ first3 %reload ] each ; : load-data-regs ( data-regs -- ) [ first3 %reload ] each ;
M: _gc generate-insn M: ##gc generate-insn
"no-gc" define-label "no-gc" define-label
{ {
[ [ "no-gc" get ] dip [ temp1>> ] [ temp2>> ] bi %check-nursery ] [ [ "no-gc" get ] dip [ size>> ] [ temp1>> ] [ temp2>> ] tri %check-nursery ]
[ [ uninitialized-locs>> ] [ temp1>> ] bi wipe-locs ] [ [ uninitialized-locs>> ] [ temp1>> ] bi wipe-locs ]
[ data-values>> save-data-regs ] [ data-values>> save-data-regs ]
[ [ tagged-values>> ] [ temp1>> ] bi save-gc-roots ] [ [ tagged-values>> ] [ temp1>> ] bi save-gc-roots ]

View File

@ -317,7 +317,7 @@ HOOK: %allot cpu ( dst size class temp -- )
HOOK: %write-barrier cpu ( src card# table -- ) HOOK: %write-barrier cpu ( src card# table -- )
! GC checks ! GC checks
HOOK: %check-nursery cpu ( label temp1 temp2 -- ) HOOK: %check-nursery cpu ( label size temp1 temp2 -- )
HOOK: %save-gc-root cpu ( gc-root register -- ) HOOK: %save-gc-root cpu ( gc-root register -- )
HOOK: %load-gc-root cpu ( gc-root register -- ) HOOK: %load-gc-root cpu ( gc-root register -- )
HOOK: %call-gc cpu ( gc-root-count temp1 -- ) HOOK: %call-gc cpu ( gc-root-count temp1 -- )

View File

@ -446,12 +446,11 @@ M:: ppc %write-barrier ( src card# table -- )
src card# deck-bits SRWI src card# deck-bits SRWI
table scratch-reg card# STBX ; table scratch-reg card# STBX ;
M:: ppc %check-nursery ( label temp1 temp2 -- ) M:: ppc %check-nursery ( label size temp1 temp2 -- )
temp2 load-zone-ptr temp2 load-zone-ptr
temp1 temp2 cell LWZ temp1 temp2 cell LWZ
temp2 temp2 3 cells LWZ temp2 temp2 3 cells LWZ
! add ALLOT_BUFFER_ZONE to here temp1 temp1 size ADDI
temp1 temp1 1024 ADDI
! is here >= end? ! is here >= end?
temp1 0 temp2 CMP temp1 0 temp2 CMP
label BLE ; label BLE ;

View File

@ -410,10 +410,10 @@ M:: x86 %write-barrier ( src card# table -- )
table table [] MOV table table [] MOV
table card# [+] card-mark <byte> MOV ; table card# [+] card-mark <byte> MOV ;
M:: x86 %check-nursery ( label temp1 temp2 -- ) M:: x86 %check-nursery ( label size temp1 temp2 -- )
temp1 load-zone-ptr temp1 load-zone-ptr
temp2 temp1 cell [+] MOV temp2 temp1 cell [+] MOV
temp2 1024 ADD temp2 size ADD
temp1 temp1 3 cells [+] MOV temp1 temp1 3 cells [+] MOV
temp2 temp1 CMP temp2 temp1 CMP
label JLE ; label JLE ;

View File

@ -738,10 +738,10 @@ object *factor_vm::allot_object(header header, cell size)
object *obj; object *obj;
if(nursery.size - allot_buffer_zone > size) if(nursery.size > size)
{ {
/* If there is insufficient room, collect the nursery */ /* If there is insufficient room, collect the nursery */
if(nursery.here + allot_buffer_zone + size > nursery.end) if(nursery.here + size > nursery.end)
garbage_collection(data->nursery(),false,true,0); garbage_collection(data->nursery(),false,true,0);
cell h = nursery.here; cell h = nursery.here;

View File

@ -58,11 +58,6 @@ struct gc_state {
} }
}; };
/* We leave this many bytes free at the top of the nursery so that inline
allocation (which does not call GC because of possible roots in volatile
registers) does not run out of memory */
static const cell allot_buffer_zone = 1024;
VM_C_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm); VM_C_API void inline_gc(cell *gc_roots_base, cell gc_roots_size, factor_vm *myvm);
} }