Gabriele Gorla - 2025-12-15

The extra temp is from different icode sequences fed to the codegen.
For the suboptimal case (just compiled with the current svn), the address of array[array_index] is computed into sloc0_1_0.
Then it is copied to sloc1_1_0 for every single use.
This is not only wasteful of ZP space is also wasteful for performance.
Ideally the higher level optimizer would realize that sloc0_1_0 is not modified by any of the code, so it can be used directly.

;    [---] ic:4:    iTemp2 [k6 lr7:12 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char [3] __code* fixed}{ sir@ _func_sloc0_1_0}[_func_sloc0_1_0] = iTemp0 [k3 lr3:7 so:0]{ ia0 a2p0 re0 rm1 nos0 ru0 dp0 oe0}{const-unsigned-char [3] __code* fixed}[remat] + iTemp1 [k5 lr6:7 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{unsigned-int fixed}[a x ]
;   m6502_genPlus
    clc     ; A:U-:???  X:U-:???  Y:--:???  F:? C:0
    adc #_array     ; A:U-:???  X:U-:???  Y:--:???  F:a C:?
    sta *_func_sloc0_1_0    ; A:U-:???  X:U-:???  Y:--:???  F:a C:?
    txa     ; A:--:A+0  X:U-:???  Y:--:???  F:a C:?
    adc #>_array    ; A:U-:???  X:U-:???  Y:--:???  F:a C:?
    sta *(_func_sloc0_1_0 + 1)  ; A:U-:???  X:U-:???  Y:--:???  F:a C:?
;   Raw cost for generated ic 4 : (10, 14.000000) count=1.000000
;    [---] ic:6:    iTemp4 [k8 lr8:9 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char fixed}[a ] = @[iTemp2 [k6 lr7:12 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char [3] __code* fixed}{ sir@ _func_sloc0_1_0}[_func_sloc0_1_0] + 0x0 {const-unsigned-char literal}]
;   genPointerGet
    ldy #0x00   ; A:--:A+1  X:--:???  Y:--:???  F:y C:?
    lda [*_func_sloc0_1_0],y    ; A:--:???  X:--:???  Y:U-:#00  F:a C:?
;   Raw cost for generated ic 6 : (4, 7.000000) count=1.000000
;    [---] ic:7:    if iTemp4 [k8 lr8:9 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char fixed}[a ] == 0 goto _return($4)
;   genIfx
;   genIfxJump : z
    beq 00104$
; Peephole branch 1 - inverted bne and eliminated jmp
; Peephole label - removed redundant label 00113$
;   Raw cost for generated ic 7 : (5, 5.600000) count=1.000000
;   zp_reg.c: 36: array[array_index][2] );
;    [---] ic:13:   iTemp9 [k14 lr10:11 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char __code* fixed}{ sir@ _func_sloc1_1_0}[_func_sloc1_1_0] := iTemp2 [k6 lr7:12 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char [3] __code* fixed}{ sir@ _func_sloc0_1_0}[_func_sloc0_1_0]
;   genAssign
;   genCopy
    lda *(_func_sloc0_1_0 + 1)  ; A:--:???  X:--:???  Y:--:#00  F:a C:?
    sta *(_func_sloc1_1_0 + 1)  ; A:U-:A+1  X:--:???  Y:--:#00  F:a C:?
    lda *_func_sloc0_1_0    ; A:--:???  X:--:???  Y:--:#00  F:a C:?
    sta *_func_sloc1_1_0    ; A:U-:A+0  X:--:???  Y:--:#00  F:a C:?
;   Raw cost for generated ic 13 : (8, 12.000000) count=0.750000
;    [---] ic:14:   iTemp5 [k9 lr11:17 so:0]{ ia0 a2p0 re1 rm0 nos0 ru0 dp0 oe0}{unsigned-char fixed}{ sir@ _func___400000002_40000_7}[x ] = @[iTemp9 [k14 lr10:11 so:0]{ ia1 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char __code* fixed}{ sir@ _func_sloc1_1_0}[_func_sloc1_1_0] + 0x2 {unsigned-char literal}]
;   genPointerGet
    ldy #0x02   ; A:--:A+0  X:--:???  Y:--:#00  F:y C:?
    lda [*_func_sloc1_1_0],y    ; A:--:???  X:--:???  Y:U-:#02  F:a C:?
    tax     ; A:--:???  X:--:???  Y:U-:#02  F:x C:?
;   Raw cost for generated ic 14 : (5, 9.000000) count=0.750000
;   zp_reg.c: 35: inline_func( array[array_index][1],
;    [--x] ic:19:   iTemp15 [k21 lr12:13 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char __code* fixed}{ sir@ _func_sloc1_1_0}[_func_sloc1_1_0] := iTemp2 [k6 lr7:12 so:0]{ ia0 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char [3] __code* fixed}{ sir@ _func_sloc0_1_0}[_func_sloc0_1_0]
;   genAssign
;   genCopy
    lda *(_func_sloc0_1_0 + 1)  ; A:--:???  X:UL:???  Y:--:#02  F:a C:?
    sta *(_func_sloc1_1_0 + 1)  ; A:U-:A+1  X:UL:???  Y:--:#02  F:a C:?
    lda *_func_sloc0_1_0    ; A:--:???  X:UL:???  Y:--:#02  F:a C:?
    sta *_func_sloc1_1_0    ; A:U-:A+0  X:UL:???  Y:--:#02  F:a C:?
;   Raw cost for generated ic 19 : (8, 12.000000) count=0.750000
;    [--x] ic:20:   iTemp11 [k16 lr13:15 so:0]{ ia0 a2p0 re1 rm0 nos0 ru0 dp0 oe0}{unsigned-char fixed}{ sir@ _func___400000001_40000_7}[a ] = @[iTemp15 [k21 lr12:13 so:0]{ ia1 a2p0 re0 rm0 nos0 ru0 dp0 oe0}{const-unsigned-char __code* fixed}{ sir@ _func_sloc1_1_0}[_func_sloc1_1_0] + 0x1 {_Bool literal}]