1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-12-24 04:31:02 +00:00

Added a test with two levels of methods to test live ranges / call-paths and allocation of a minimal number of registers.

This commit is contained in:
jespergravgaard 2017-11-10 00:27:56 +01:00
parent 514797897e
commit b0e6ae0b67
6 changed files with 2318 additions and 0 deletions

View File

@ -24,6 +24,10 @@ public class TestPrograms extends TestCase {
helper = new ReferenceHelper("dk/camelot64/kickc/test/ref/");
}
public void testOverlapAllocation2() throws IOException, URISyntaxException {
compileAndCompare("overlap-allocation-2");
}
public void testOverlapAllocation() throws IOException, URISyntaxException {
compileAndCompare("overlap-allocation");
}

View File

@ -0,0 +1,20 @@
// Two levels of functions to test that register allocation handles live ranges and call-ranges optimally to allocate the fewest possible ZP-variables
byte* SCREEN = $0400;
void main() {
for(byte i : 0..8) {
line(i);
}
for(byte j : 10..18) {
line(j);
}
}
void line(byte l) {
plot(l);
plot(l+20);
}
void plot(byte x) {
SCREEN[x] = '*';
}

View File

@ -0,0 +1,35 @@
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
.const SCREEN = $400
jsr main
main: {
ldy #0
b1:
jsr line
iny
cpy #9
bne b1
ldy #$a
b2:
jsr line
iny
cpy #$13
bne b2
rts
}
line: {
tya
jsr plot
tya
clc
adc #$14
jsr plot
rts
}
plot: {
tax
lda #'*'
sta SCREEN,x
rts
}

View File

@ -0,0 +1,50 @@
@begin: scope:[] from
to:@3
@3: scope:[] from @begin
[0] call main param-assignment [ ] ( )
to:@end
@end: scope:[] from @3
main: scope:[main] from @3
[1] phi() [ ] ( main:0 [ ] )
to:main::@1
main::@1: scope:[main] from main main::@5
[2] (byte) main::i#2 ← phi( main/(byte) 0 main::@5/(byte) main::i#1 ) [ main::i#2 ] ( main:0 [ main::i#2 ] )
[3] (byte) line::l#0 ← (byte) main::i#2 [ main::i#2 line::l#0 ] ( main:0 [ main::i#2 line::l#0 ] )
[4] call line param-assignment [ main::i#2 ] ( main:0 [ main::i#2 ] )
to:main::@5
main::@5: scope:[main] from main::@1
[5] (byte) main::i#1 ← ++ (byte) main::i#2 [ main::i#1 ] ( main:0 [ main::i#1 ] )
[6] if((byte) main::i#1!=(byte) 9) goto main::@1 [ main::i#1 ] ( main:0 [ main::i#1 ] )
to:main::@2
main::@2: scope:[main] from main::@5 main::@6
[7] (byte) main::j#2 ← phi( main::@5/(byte) 10 main::@6/(byte) main::j#1 ) [ main::j#2 ] ( main:0 [ main::j#2 ] )
[8] (byte) line::l#1 ← (byte) main::j#2 [ main::j#2 line::l#1 ] ( main:0 [ main::j#2 line::l#1 ] )
[9] call line param-assignment [ main::j#2 ] ( main:0 [ main::j#2 ] )
to:main::@6
main::@6: scope:[main] from main::@2
[10] (byte) main::j#1 ← ++ (byte) main::j#2 [ main::j#1 ] ( main:0 [ main::j#1 ] )
[11] if((byte) main::j#1!=(byte) 19) goto main::@2 [ main::j#1 ] ( main:0 [ main::j#1 ] )
to:main::@return
main::@return: scope:[main] from main::@6
[12] return [ ] ( main:0 [ ] )
to:@return
line: scope:[line] from main::@1 main::@2
[13] (byte) line::l#2 ← phi( main::@1/(byte) line::l#0 main::@2/(byte) line::l#1 ) [ line::l#2 ] ( main:0::line:4 [ main::i#2 line::l#2 ] main:0::line:9 [ main::j#2 line::l#2 ] )
[14] (byte) plot::x#0 ← (byte) line::l#2 [ line::l#2 plot::x#0 ] ( main:0::line:4 [ main::i#2 line::l#2 plot::x#0 ] main:0::line:9 [ main::j#2 line::l#2 plot::x#0 ] )
[15] call plot param-assignment [ line::l#2 ] ( main:0::line:4 [ main::i#2 line::l#2 ] main:0::line:9 [ main::j#2 line::l#2 ] )
to:line::@1
line::@1: scope:[line] from line
[16] (byte~) line::$1 ← (byte) line::l#2 + (byte) 20 [ line::$1 ] ( main:0::line:4 [ main::i#2 line::$1 ] main:0::line:9 [ main::j#2 line::$1 ] )
[17] (byte) plot::x#1 ← (byte~) line::$1 [ plot::x#1 ] ( main:0::line:4 [ main::i#2 plot::x#1 ] main:0::line:9 [ main::j#2 plot::x#1 ] )
[18] call plot param-assignment [ ] ( main:0::line:4 [ main::i#2 ] main:0::line:9 [ main::j#2 ] )
to:line::@return
line::@return: scope:[line] from line::@1
[19] return [ ] ( main:0::line:4 [ main::i#2 ] main:0::line:9 [ main::j#2 ] )
to:@return
plot: scope:[plot] from line line::@1
[20] (byte) plot::x#2 ← phi( line/(byte) plot::x#0 line::@1/(byte) plot::x#1 ) [ plot::x#2 ] ( main:0::line:4::plot:15 [ main::i#2 line::l#2 plot::x#2 ] main:0::line:9::plot:15 [ main::j#2 line::l#2 plot::x#2 ] main:0::line:4::plot:18 [ main::i#2 plot::x#2 ] main:0::line:9::plot:18 [ main::j#2 plot::x#2 ] )
[21] *((const byte*) SCREEN#0 + (byte) plot::x#2) ← (byte) '*' [ ] ( main:0::line:4::plot:15 [ main::i#2 line::l#2 ] main:0::line:9::plot:15 [ main::j#2 line::l#2 ] main:0::line:4::plot:18 [ main::i#2 ] main:0::line:9::plot:18 [ main::j#2 ] )
to:plot::@return
plot::@return: scope:[plot] from plot
[22] return [ ] ( main:0::line:4::plot:15 [ main::i#2 line::l#2 ] main:0::line:9::plot:15 [ main::j#2 line::l#2 ] main:0::line:4::plot:18 [ main::i#2 ] main:0::line:9::plot:18 [ main::j#2 ] )
to:@return

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,37 @@
(label) @3
(label) @begin
(label) @end
(byte*) SCREEN
(const byte*) SCREEN#0 SCREEN = (word) 1024
(void()) line((byte) line::l)
(byte~) line::$1 reg byte a 4.0
(label) line::@1
(label) line::@return
(byte) line::l
(byte) line::l#0 reg byte y 22.0
(byte) line::l#1 reg byte y 22.0
(byte) line::l#2 reg byte y 8.666666666666666
(void()) main()
(label) main::@1
(label) main::@2
(label) main::@5
(label) main::@6
(label) main::@return
(byte) main::i
(byte) main::i#1 reg byte y 16.5
(byte) main::i#2 reg byte y 11.0
(byte) main::j
(byte) main::j#1 reg byte y 16.5
(byte) main::j#2 reg byte y 11.0
(void()) plot((byte) plot::x)
(label) plot::@return
(byte) plot::x
(byte) plot::x#0 reg byte a 4.0
(byte) plot::x#1 reg byte a 4.0
(byte) plot::x#2 reg byte a 6.0
reg byte y [ main::i#2 main::i#1 ]
reg byte y [ main::j#2 main::j#1 ]
reg byte y [ line::l#2 line::l#0 line::l#1 ]
reg byte a [ plot::x#2 plot::x#0 plot::x#1 ]
reg byte a [ line::$1 ]