1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-09-08 17:54:40 +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() {
if(operator == null) 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;
}

View File

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

View File

@ -3,8 +3,8 @@
void main() {
byte* screen = 0x400;
for( byte i: 0..2) {
*screen++ = i+1;
*screen++ = i+1;
*screen++ = i*2;
*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
lda #>PLAYFIELD_SCREEN_1+2*$28+$10
sta li_1+1
ldx #0
ldy #0
b1:
txa
tya
asl
tay
tax
lda li_1
sta screen_lines_1,y
sta screen_lines_1,x
lda li_1+1
sta screen_lines_1+1,y
txa
asl
tay
sta screen_lines_1+1,x
lda li_2
sta screen_lines_2,y
sta screen_lines_2,x
lda li_2+1
sta screen_lines_2+1,y
sta screen_lines_2+1,x
lda #$28
clc
adc li_1
@ -1442,8 +1439,8 @@ render_init: {
bcc !+
inc li_2+1
!:
inx
cpx #PLAYFIELD_LINES-1+1
iny
cpy #PLAYFIELD_LINES-1+1
bne b1
rts
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -4,6 +4,7 @@
:BasicUpstart(main)
.pc = $80d "Program"
main: {
.label _1 = 4
.label screen = 2
lda #<$400
sta screen
@ -12,19 +13,15 @@ main: {
ldx #0
b1:
txa
tay
iny
tya
asl
sta _1
ldy #0
sta (screen),y
inc screen
bne !+
inc screen+1
!:
txa
tay
iny
tya
lda _1
ldy #0
sta (screen),y
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:
lda i
asl
tay
lda dividends,y
tax
lda dividends,x
sta dividend
lda dividends+1,y
lda dividends+1,x
sta dividend+1
lda i
asl
tay
lda divisors,y
lda divisors,x
sta divisor
lda divisors+1,y
lda divisors+1,x
sta divisor+1
jsr div16s
lda print_line_cursor
@ -76,9 +73,7 @@ test_16s: {
inc i
lda #6
cmp i
beq !b1+
jmp b1
!b1:
bne b1
rts
dividends: .word $7fff, $7fff, -$7fff, -$7fff, $7fff, -$7fff
divisors: .word 5, -7, $b, -$d, -$11, $13
@ -539,17 +534,14 @@ test_16u: {
b1:
lda i
asl
tay
lda dividends,y
tax
lda dividends,x
sta dividend
lda dividends+1,y
lda dividends+1,x
sta dividend+1
lda i
asl
tay
lda divisors,y
lda divisors,x
sta divisor
lda divisors+1,y
lda divisors+1,x
sta divisor+1
jsr div16u
lda print_line_cursor