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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -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");
|
||||||
|
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
12
src/test/kc/subexpr-optimize-1.kc
Normal file
12
src/test/kc/subexpr-optimize-1.kc
Normal 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];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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:
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
21
src/test/ref/subexpr-optimize-1.asm
Normal file
21
src/test/ref/subexpr-optimize-1.asm
Normal 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
|
||||||
|
}
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user