1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-08-11 17:25:41 +00:00

Added tests for duplicate assignment right side optimization.

This commit is contained in:
jespergravgaard
2019-05-22 08:06:54 +02:00
parent c1213f4d55
commit 2c808e59d6
13 changed files with 117 additions and 108 deletions

View File

@@ -109,6 +109,19 @@ public class Pass2DuplicateRValueIdentification extends Pass2SsaOptimization {
private boolean isTrivial() { private boolean isTrivial() {
if(operator == null) return true; if(operator == null) return true;
if(operator instanceof OperatorCast) return true; if(operator instanceof OperatorCast) return true;
if(operator.equals(Operators.PLUS)) return true;
if(operator.equals(Operators.MINUS)) return true;
if(operator.equals(Operators.BOOL_AND)) return true;
if(operator.equals(Operators.BOOL_OR)) return true;
if(operator.equals(Operators.BOOL_XOR)) return true;
if(operator.equals(Operators.BOOL_NOT)) return true;
if(operator.equals(Operators.LE)) return true;
if(operator.equals(Operators.LT)) return true;
if(operator.equals(Operators.GE)) return true;
if(operator.equals(Operators.GT)) return true;
if(operator.equals(Operators.EQ)) return true;
if(operator.equals(Operators.NEQ)) return true;
if(operator.equals(Operators.LOGIC_NOT)) return true;
return false; return false;
} }

View File

@@ -63,6 +63,11 @@ public class TestPrograms {
*/ */
@Test
public void testSubExprOptimize1() throws IOException, URISyntaxException {
compileAndCompare("subexpr-optimize-1");
}
@Test @Test
public void testSubExprOptimize0() throws IOException, URISyntaxException { public void testSubExprOptimize0() throws IOException, URISyntaxException {
compileAndCompare("subexpr-optimize-0"); compileAndCompare("subexpr-optimize-0");

View File

@@ -3,8 +3,8 @@
void main() { void main() {
byte* screen = 0x400; byte* screen = 0x400;
for( byte i: 0..2) { for( byte i: 0..2) {
*screen++ = i+1; *screen++ = i*2;
*screen++ = i+1; *screen++ = i*2;
} }
} }

View File

@@ -0,0 +1,12 @@
// A sub-expression that should not be optimized (+1 to a pointer)
void main() {
byte* SCREEN = 0x0400;
for(byte i: 0..38) {
SCREEN[i] = SCREEN[i+1];
(SCREEN+40)[i] = (SCREEN+40)[i+1];
(SCREEN+80)[i] = (SCREEN+80)[i+1];
(SCREEN+120)[i] = (SCREEN+120)[i+1];
}
}

View File

@@ -1412,22 +1412,19 @@ render_init: {
sta li_1 sta li_1
lda #>PLAYFIELD_SCREEN_1+2*$28+$10 lda #>PLAYFIELD_SCREEN_1+2*$28+$10
sta li_1+1 sta li_1+1
ldx #0 ldy #0
b1: b1:
txa tya
asl asl
tay tax
lda li_1 lda li_1
sta screen_lines_1,y sta screen_lines_1,x
lda li_1+1 lda li_1+1
sta screen_lines_1+1,y sta screen_lines_1+1,x
txa
asl
tay
lda li_2 lda li_2
sta screen_lines_2,y sta screen_lines_2,x
lda li_2+1 lda li_2+1
sta screen_lines_2+1,y sta screen_lines_2+1,x
lda #$28 lda #$28
clc clc
adc li_1 adc li_1
@@ -1442,8 +1439,8 @@ render_init: {
bcc !+ bcc !+
inc li_2+1 inc li_2+1
!: !:
inx iny
cpx #PLAYFIELD_LINES-1+1 cpy #PLAYFIELD_LINES-1+1
bne b1 bne b1
rts rts
} }

View File

@@ -244,42 +244,35 @@ mulf_init: {
sta add sta add
lda #0 lda #0
sta add+1 sta add+1
tax tay
sta sqr sta sqr
sta sqr+1 sta sqr+1
b1: b1:
lda sqr+1 lda sqr+1
sta val sta val
sta mulf_sqr1,y
sta mulf_sqr1+$100,y
tya
eor #$ff
tax
inx
lda val
sta mulf_sqr1,x sta mulf_sqr1,x
sta mulf_sqr1+$100,x sta mulf_sqr1+$100,x
txa sta mulf_sqr2+1,y
sta mulf_sqr2+$100+1,y
tya
eor #$ff eor #$ff
tay tax
iny axs #1+1
lda val lda val
sta mulf_sqr1,y sta mulf_sqr2,x
txa tya
eor #$ff eor #$ff
tay tax
iny axs #1+1
lda val lda val
sta mulf_sqr1+$100,y sta mulf_sqr2+$100,x
sta mulf_sqr2+1,x
sta mulf_sqr2+$100+1,x
txa
eor #$ff
clc
adc #1+1
tay
lda val
sta mulf_sqr2,y
txa
eor #$ff
clc
adc #1+1
tay
lda val
sta mulf_sqr2+$100,y
lda sqr lda sqr
clc clc
adc add adc add
@@ -294,8 +287,8 @@ mulf_init: {
bcc !+ bcc !+
inc add+1 inc add+1
!: !:
inx iny
cpx #$81 cpy #$81
bne b1 bne b1
rts rts
} }

View File

@@ -120,17 +120,13 @@ plexShowSprite: {
ldx plex_sprite_idx ldx plex_sprite_idx
sta PLEX_SCREEN_PTR,x sta PLEX_SCREEN_PTR,x
ldy plex_show_idx ldy plex_show_idx
ldx PLEX_SORTED_IDX,y lda PLEX_SORTED_IDX,y
txa
asl asl
tay tax
lda PLEX_XPOS,y lda PLEX_XPOS,x
ldy plex_sprite_idx2 ldy plex_sprite_idx2
sta SPRITES_XPOS,y sta SPRITES_XPOS,y
txa lda PLEX_XPOS+1,x
asl
tay
lda PLEX_XPOS+1,y
cmp #0 cmp #0
bne b1 bne b1
lda #$ff lda #$ff

View File

@@ -127,17 +127,14 @@ point_init: {
.label x_diff = 9 .label x_diff = 9
lda point_idx lda point_idx
asl asl
tay tax
lda x_end,y lda x_end,x
sta _0 sta _0
lda x_end+1,y lda x_end+1,x
sta _0+1 sta _0+1
lda point_idx lda x_start,x
asl
tay
lda x_start,y
sta _1 sta _1
lda x_start+1,y lda x_start+1,x
sta _1+1 sta _1+1
lda x_diff lda x_diff
sec sec
@@ -191,10 +188,10 @@ point_init: {
b2: b2:
lda point_idx lda point_idx
asl asl
tay tax
lda x_start,y lda x_start,x
sta _9 sta _9
lda x_start+1,y lda x_start+1,x
sta _9+1 sta _9+1
asl _9 asl _9
rol _9+1 rol _9+1
@@ -204,13 +201,10 @@ point_init: {
rol _9+1 rol _9+1
asl _9 asl _9
rol _9+1 rol _9+1
lda point_idx
asl
tay
lda _9 lda _9
sta x_cur,y sta x_cur,x
lda _9+1 lda _9+1
sta x_cur+1,y sta x_cur+1,x
ldy point_idx ldy point_idx
lda y_start,y lda y_start,y
sta _10 sta _10
@@ -224,15 +218,11 @@ point_init: {
rol _11+1 rol _11+1
asl _11 asl _11
rol _11+1 rol _11+1
tya
asl
tay
lda _11 lda _11
sta y_cur,y sta y_cur,x
lda _11+1 lda _11+1
sta y_cur+1,y sta y_cur+1,x
lda #DELAY lda #DELAY
ldy point_idx
sta delay,y sta delay,y
rts rts
b1: b1:

View File

@@ -290,17 +290,13 @@ plexShowSprite: {
ldx plex_sprite_idx ldx plex_sprite_idx
sta PLEX_SCREEN_PTR,x sta PLEX_SCREEN_PTR,x
ldy plex_show_idx ldy plex_show_idx
ldx PLEX_SORTED_IDX,y lda PLEX_SORTED_IDX,y
txa
asl asl
tay tax
lda PLEX_XPOS,y lda PLEX_XPOS,x
ldy plex_sprite_idx2 ldy plex_sprite_idx2
sta SPRITES_XPOS,y sta SPRITES_XPOS,y
txa lda PLEX_XPOS+1,x
asl
tay
lda PLEX_XPOS+1,y
cmp #0 cmp #0
bne b1 bne b1
lda #$ff lda #$ff

View File

@@ -37,9 +37,6 @@ position_sprite: {
tay tay
lda #y lda #y
sta SPRITES_YPOS,y sta SPRITES_YPOS,y
lda spriteno
asl
tay
lda x lda x
sta SPRITES_XPOS,y sta SPRITES_XPOS,y
lda x+1 lda x+1

View File

@@ -4,6 +4,7 @@
:BasicUpstart(main) :BasicUpstart(main)
.pc = $80d "Program" .pc = $80d "Program"
main: { main: {
.label _1 = 4
.label screen = 2 .label screen = 2
lda #<$400 lda #<$400
sta screen sta screen
@@ -12,19 +13,15 @@ main: {
ldx #0 ldx #0
b1: b1:
txa txa
tay asl
iny sta _1
tya
ldy #0 ldy #0
sta (screen),y sta (screen),y
inc screen inc screen
bne !+ bne !+
inc screen+1 inc screen+1
!: !:
txa lda _1
tay
iny
tya
ldy #0 ldy #0
sta (screen),y sta (screen),y
inc screen inc screen

View File

@@ -0,0 +1,21 @@
// A sub-expression that should not be optimized (+1 to a pointer)
.pc = $801 "Basic"
:BasicUpstart(main)
.pc = $80d "Program"
main: {
.label SCREEN = $400
ldx #0
b1:
lda SCREEN+1,x
sta SCREEN,x
lda SCREEN+$28+1,x
sta SCREEN+$28,x
lda SCREEN+$50+1,x
sta SCREEN+$50,x
lda SCREEN+$78+1,x
sta SCREEN+$78,x
inx
cpx #$27
bne b1
rts
}

View File

@@ -24,17 +24,14 @@ test_16s: {
b1: b1:
lda i lda i
asl asl
tay tax
lda dividends,y lda dividends,x
sta dividend sta dividend
lda dividends+1,y lda dividends+1,x
sta dividend+1 sta dividend+1
lda i lda divisors,x
asl
tay
lda divisors,y
sta divisor sta divisor
lda divisors+1,y lda divisors+1,x
sta divisor+1 sta divisor+1
jsr div16s jsr div16s
lda print_line_cursor lda print_line_cursor
@@ -76,9 +73,7 @@ test_16s: {
inc i inc i
lda #6 lda #6
cmp i cmp i
beq !b1+ bne b1
jmp b1
!b1:
rts rts
dividends: .word $7fff, $7fff, -$7fff, -$7fff, $7fff, -$7fff dividends: .word $7fff, $7fff, -$7fff, -$7fff, $7fff, -$7fff
divisors: .word 5, -7, $b, -$d, -$11, $13 divisors: .word 5, -7, $b, -$d, -$11, $13
@@ -539,17 +534,14 @@ test_16u: {
b1: b1:
lda i lda i
asl asl
tay tax
lda dividends,y lda dividends,x
sta dividend sta dividend
lda dividends+1,y lda dividends+1,x
sta dividend+1 sta dividend+1
lda i lda divisors,x
asl
tay
lda divisors,y
sta divisor sta divisor
lda divisors+1,y lda divisors+1,x
sta divisor+1 sta divisor+1
jsr div16u jsr div16u
lda print_line_cursor lda print_line_cursor