1
0
mirror of https://github.com/cc65/cc65.git synced 2024-12-23 19:29:37 +00:00
cc65/test/val/bug1652-optimizer.c

123 lines
1.7 KiB
C
Raw Normal View History

/* #1652 - Regression in code optimization */
#include <stdlib.h>
/* better before pr#1231
before:
jsr pusha
ldy #$01
ldx #$00
lda (sp),y
beq L0005
lda (sp,x)
beq L0005
txa
jmp incsp2 ; <--
L0005: tya
jmp incsp2
after:
jsr pusha
ldy #$01
ldx #$00
lda (sp),y
beq L0004
lda (sp,x)
beq L0004
txa
jmp L0001 ; <--
L0004: tya
L0001: jmp incsp2
*/
int foo(unsigned char bar, unsigned char baz)
{
return (bar == 0 || baz == 0);
}
/* worse before pr#1231
before:
;
; y = 1;
;
lda #$01
sta _y
;
; (*tablePtr)[y][x] = 83;
;
ldx #$00
lda _y
jsr aslax2
clc
adc _tablePtr
pha
txa
adc _tablePtr+1
tax
pla
clc
adc _x
bcc L0019
inx
L0019:
sta ptr1
stx ptr1+1
lda #$53
ldy #$00
sta (ptr1),y
after:
;
; y = 1;
;
lda #$01
sta _y
;
; (*tablePtr)[y][x] = 83;
;
ldx #$00
lda _y
jsr aslax2
clc
adc _tablePtr
sta ptr1
txa
adc _tablePtr+1
sta ptr1+1
ldy _x
lda #$53
sta (ptr1),y
*/
typedef unsigned char array_t[4][4];
static array_t table = {
{12, 13, 14, 15},
{ 8, 9, 10, 11},
{ 4, 5, 6, 7},
{ 0, 1, 2, 3}
};
static array_t *tablePtr = &table;
static unsigned char y = 0, x;
void pointed_array(void)
{
x = 3;
y = 1;
(*tablePtr)[y][x] = 83;
}
int main(void)
{
pointed_array();
return foo(2, 0) ? EXIT_SUCCESS : EXIT_FAILURE;
}