Fixing struct type SIZE_OF struct Point to 4 CONTROL FLOW GRAPH SSA void main() main: scope:[main] from __start SCREEN[0] = SIZEOF_STRUCT_POINT to:main::@return main::@return: scope:[main] from main return to:@return void __start() __start: scope:[__start] from call main to:__start::@1 __start::@1: scope:[__start] from __start to:__start::@return __start::@return: scope:[__start] from __start::@1 return to:@return SYMBOL TABLE SSA __constant char * const SCREEN = (char *)$400 __constant char SIZEOF_STRUCT_POINT = 4 void __start() void main() Adding number conversion cast (unumber) 0 in SCREEN[0] = SIZEOF_STRUCT_POINT Successful SSA optimization PassNAddNumberTypeConversions Simplifying constant pointer cast (char *) 1024 Simplifying constant integer cast 0 Successful SSA optimization PassNCastSimplification Finalized unsigned number type (char) 0 Successful SSA optimization PassNFinalizeNumberTypeConversions Simplifying expression containing zero SCREEN in [0] SCREEN[0] = SIZEOF_STRUCT_POINT Successful SSA optimization PassNSimplifyExpressionWithZero Removing unused procedure __start Removing unused procedure block __start Removing unused procedure block __start::@1 Removing unused procedure block __start::@return Successful SSA optimization PassNEliminateEmptyStart Finalized unsigned number type (char) 2 Finalized unsigned number type (char) 2 Successful SSA optimization PassNFinalizeNumberTypeConversions CALL GRAPH Created 0 initial phi equivalence classes Coalesced down to 0 phi equivalence classes FINAL CONTROL FLOW GRAPH void main() main: scope:[main] from [0] *SCREEN = SIZEOF_STRUCT_POINT to:main::@return main::@return: scope:[main] from main [1] return to:@return VARIABLE REGISTER WEIGHTS void main() Initial phi equivalence classes Complete equivalence classes REGISTER UPLIFT POTENTIAL REGISTERS Statement [0] *SCREEN = SIZEOF_STRUCT_POINT [ ] ( [ ] { } ) always clobbers reg byte a REGISTER UPLIFT SCOPES Uplift Scope [Point] Uplift Scope [main] Uplift Scope [] Uplifting [Point] best 15 combination Uplifting [main] best 15 combination Uplifting [] best 15 combination ASSEMBLER BEFORE OPTIMIZATION // File Comments // Minimal struct with C-Standard behavior - member array sizeof // Upstart // Commodore 64 PRG executable file .file [name="struct-25.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) // Global Constants & labels .const SIZEOF_STRUCT_POINT = 4 .label SCREEN = $400 .segment Code // main main: { // [0] *SCREEN = SIZEOF_STRUCT_POINT -- _deref_pbuc1=vbuc2 lda #SIZEOF_STRUCT_POINT sta SCREEN jmp __breturn // main::@return __breturn: // [1] return rts } // File Data ASSEMBLER OPTIMIZATIONS Removing instruction jmp __breturn Succesful ASM optimization Pass5NextJumpElimination Removing instruction __breturn: Succesful ASM optimization Pass5UnusedLabelElimination FINAL SYMBOL TABLE __constant char * const SCREEN = (char *) 1024 __constant char SIZEOF_STRUCT_POINT = 4 void main() FINAL ASSEMBLER Score: 12 // File Comments // Minimal struct with C-Standard behavior - member array sizeof // Upstart // Commodore 64 PRG executable file .file [name="struct-25.prg", type="prg", segments="Program"] .segmentdef Program [segments="Basic, Code, Data"] .segmentdef Basic [start=$0801] .segmentdef Code [start=$80d] .segmentdef Data [startAfter="Code"] .segment Basic :BasicUpstart(main) // Global Constants & labels .const SIZEOF_STRUCT_POINT = 4 .label SCREEN = $400 .segment Code // main main: { // SCREEN[0] = sizeof(struct Point) // [0] *SCREEN = SIZEOF_STRUCT_POINT -- _deref_pbuc1=vbuc2 lda #SIZEOF_STRUCT_POINT sta SCREEN // main::@return // } // [1] return rts } // File Data