diff --git a/src/test/ref/enum-3.asm b/src/test/ref/enum-3.asm new file mode 100644 index 000000000..455c97fc3 --- /dev/null +++ b/src/test/ref/enum-3.asm @@ -0,0 +1,11 @@ +// Test of simple enum - value with complex calculation +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + .const BROKEN = 4*4+2+1 +main: { + .label SCREEN = $400 + lda #BROKEN + sta SCREEN + rts +} diff --git a/src/test/ref/enum-3.cfg b/src/test/ref/enum-3.cfg new file mode 100644 index 000000000..95fa1e6ad --- /dev/null +++ b/src/test/ref/enum-3.cfg @@ -0,0 +1,15 @@ +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] *((const byte*) main::SCREEN#0) ← (const byte) BROKEN + to:main::@return +main::@return: scope:[main] from main + [5] return + to:@return diff --git a/src/test/ref/enum-3.log b/src/test/ref/enum-3.log new file mode 100644 index 000000000..5e9121240 --- /dev/null +++ b/src/test/ref/enum-3.log @@ -0,0 +1,234 @@ +Adding pointer type conversion cast (byte*) main::SCREEN in (byte*) main::SCREEN ← (number) $400 +Identified constant variable (byte) main::state + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + to:@1 +main: scope:[main] from @1 + (byte) main::state#0 ← (const byte) BROKEN + (byte*) main::SCREEN#0 ← ((byte*)) (number) $400 + *((byte*) main::SCREEN#0) ← (byte) main::state#0 + to:main::@return +main::@return: scope:[main] from main + return + to:@return +@1: scope:[] from @begin + call main + to:@2 +@2: scope:[] from @1 + to:@end +@end: scope:[] from @2 + +SYMBOL TABLE SSA +(label) @1 +(label) @2 +(label) @begin +(label) @end +(const byte) BROKEN = (number) 4*(number) 4+(number) 2+(byte) 1 +(const byte) State::BROKEN = (number) 4*(number) 4+(number) 2+(byte) 1 +(const byte) State::OFF = (byte) 0 +(const byte) State::ON = (number) 4*(number) 4+(number) 2 +(void()) main() +(label) main::@return +(byte*) main::SCREEN +(byte*) main::SCREEN#0 +(byte) main::state +(byte) main::state#0 + +Adding number conversion cast (unumber) 4*4+2 in +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast (byte*) main::SCREEN#0 ← (byte*)(number) $400 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (byte*) 1024 +Successful SSA optimization PassNCastSimplification +Constant (const byte) main::state#0 = BROKEN +Constant (const byte*) main::SCREEN#0 = (byte*) 1024 +Successful SSA optimization Pass2ConstantIdentification +Constant inlined main::state#0 = (const byte) BROKEN +Successful SSA optimization Pass2ConstantInlining +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @2 +Adding NOP phi() at start of @end +CALL GRAPH +Calls in [] to main:2 + +Created 0 initial phi equivalence classes +Coalesced down to 0 phi equivalence classes +Culled Empty Block (label) @2 +Adding NOP phi() at start of @begin +Adding NOP phi() at start of @1 +Adding NOP phi() at start of @end + +FINAL CONTROL FLOW GRAPH +@begin: scope:[] from + [0] phi() + to:@1 +@1: scope:[] from @begin + [1] phi() + [2] call main + to:@end +@end: scope:[] from @1 + [3] phi() +main: scope:[main] from @1 + [4] *((const byte*) main::SCREEN#0) ← (const byte) BROKEN + to:main::@return +main::@return: scope:[main] from main + [5] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(void()) main() +(byte*) main::SCREEN +(byte) main::state + +Initial phi equivalence classes +Complete equivalence classes + +INITIAL ASM +//SEG0 File Comments +// Test of simple enum - value with complex calculation +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const BROKEN = 4*4+2+1 +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main + jsr main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + .label SCREEN = $400 + //SEG10 [4] *((const byte*) main::SCREEN#0) ← (const byte) BROKEN -- _deref_pbuc1=vbuc2 + lda #BROKEN + sta SCREEN + jmp breturn + //SEG11 main::@return + breturn: + //SEG12 [5] return + rts +} + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [4] *((const byte*) main::SCREEN#0) ← (const byte) BROKEN [ ] ( main:2 [ ] ) always clobbers reg byte a + +REGISTER UPLIFT SCOPES +Uplift Scope [State] +Uplift Scope [main] +Uplift Scope [] + +Uplifting [State] best 27 combination +Uplifting [main] best 27 combination +Uplifting [] best 27 combination + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 File Comments +// Test of simple enum - value with complex calculation +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const BROKEN = 4*4+2+1 +//SEG3 @begin +bbegin: +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +b1_from_bbegin: + jmp b1 +//SEG5 @1 +b1: +//SEG6 [2] call main + jsr main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +bend_from_b1: + jmp bend +//SEG8 @end +bend: +//SEG9 main +main: { + .label SCREEN = $400 + //SEG10 [4] *((const byte*) main::SCREEN#0) ← (const byte) BROKEN -- _deref_pbuc1=vbuc2 + lda #BROKEN + sta SCREEN + jmp breturn + //SEG11 main::@return + breturn: + //SEG12 [5] return + rts +} + +ASSEMBLER OPTIMIZATIONS +Removing instruction jmp b1 +Removing instruction jmp bend +Removing instruction jmp breturn +Succesful ASM optimization Pass5NextJumpElimination +Removing instruction b1_from_bbegin: +Removing instruction b1: +Removing instruction bend_from_b1: +Succesful ASM optimization Pass5RedundantLabelElimination +Removing instruction bend: +Removing instruction breturn: +Succesful ASM optimization Pass5UnusedLabelElimination +Updating BasicUpstart to call main directly +Removing instruction jsr main +Succesful ASM optimization Pass5SkipBegin +Removing instruction bbegin: +Succesful ASM optimization Pass5UnusedLabelElimination + +FINAL SYMBOL TABLE +(label) @1 +(label) @begin +(label) @end +(const byte) BROKEN BROKEN = (byte)(number) 4*(number) 4+(number) 2+(byte) 1 +(const byte) State::BROKEN BROKEN = (byte)(number) 4*(number) 4+(number) 2+(byte) 1 +(const byte) State::OFF OFF = (byte) 0 +(const byte) State::ON ON = (number) 4*(number) 4+(number) 2 +(void()) main() +(label) main::@return +(byte*) main::SCREEN +(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(byte) main::state + + + +FINAL ASSEMBLER +Score: 12 + +//SEG0 File Comments +// Test of simple enum - value with complex calculation +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const BROKEN = 4*4+2+1 +//SEG3 @begin +//SEG4 [1] phi from @begin to @1 [phi:@begin->@1] +//SEG5 @1 +//SEG6 [2] call main +//SEG7 [3] phi from @1 to @end [phi:@1->@end] +//SEG8 @end +//SEG9 main +main: { + .label SCREEN = $400 + //SEG10 [4] *((const byte*) main::SCREEN#0) ← (const byte) BROKEN -- _deref_pbuc1=vbuc2 + lda #BROKEN + sta SCREEN + //SEG11 main::@return + //SEG12 [5] return + rts +} + diff --git a/src/test/ref/enum-3.sym b/src/test/ref/enum-3.sym new file mode 100644 index 000000000..aab553edf --- /dev/null +++ b/src/test/ref/enum-3.sym @@ -0,0 +1,13 @@ +(label) @1 +(label) @begin +(label) @end +(const byte) BROKEN BROKEN = (byte)(number) 4*(number) 4+(number) 2+(byte) 1 +(const byte) State::BROKEN BROKEN = (byte)(number) 4*(number) 4+(number) 2+(byte) 1 +(const byte) State::OFF OFF = (byte) 0 +(const byte) State::ON ON = (number) 4*(number) 4+(number) 2 +(void()) main() +(label) main::@return +(byte*) main::SCREEN +(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(byte) main::state +