From d1752069ceb5e0a8235e71600ab0dcc7cba12d6e Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sat, 15 Jun 2019 19:19:22 +0200 Subject: [PATCH] Added missing ref-files. --- src/test/ref/struct-ptr-13.asm | 22 ++ src/test/ref/struct-ptr-13.cfg | 18 ++ src/test/ref/struct-ptr-13.log | 353 +++++++++++++++++++++++++++++++++ src/test/ref/struct-ptr-13.sym | 13 ++ 4 files changed, 406 insertions(+) create mode 100644 src/test/ref/struct-ptr-13.asm create mode 100644 src/test/ref/struct-ptr-13.cfg create mode 100644 src/test/ref/struct-ptr-13.log create mode 100644 src/test/ref/struct-ptr-13.sym diff --git a/src/test/ref/struct-ptr-13.asm b/src/test/ref/struct-ptr-13.asm new file mode 100644 index 000000000..0a8abe241 --- /dev/null +++ b/src/test/ref/struct-ptr-13.asm @@ -0,0 +1,22 @@ +// Minimal struct - modifying pointer to struct in memory using arrow operator +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" + .const OFFSET_STRUCT_POINT_Y = 1 + .label points = $1000 +main: { + .label SCREEN = $400 + lda #5 + clc + adc points + sta points + lda #5 + clc + adc points+OFFSET_STRUCT_POINT_Y + sta points+OFFSET_STRUCT_POINT_Y + lda points + sta SCREEN + lda points+OFFSET_STRUCT_POINT_Y + sta SCREEN+1 + rts +} diff --git a/src/test/ref/struct-ptr-13.cfg b/src/test/ref/struct-ptr-13.cfg new file mode 100644 index 000000000..5a2bdf127 --- /dev/null +++ b/src/test/ref/struct-ptr-13.cfg @@ -0,0 +1,18 @@ +@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] *((byte*)(const struct Point*) points#0) ← *((byte*)(const struct Point*) points#0) + (byte) 5 + [5] *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 + [6] *((const byte*) main::SCREEN#0) ← *((byte*)(const struct Point*) points#0) + [7] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + to:main::@return +main::@return: scope:[main] from main + [8] return + to:@return diff --git a/src/test/ref/struct-ptr-13.log b/src/test/ref/struct-ptr-13.log new file mode 100644 index 000000000..340f3789b --- /dev/null +++ b/src/test/ref/struct-ptr-13.log @@ -0,0 +1,353 @@ +Rewriting struct pointer member access *((struct Point*) points).x +Rewriting struct pointer member access *((struct Point*) points).x +Rewriting struct pointer member access *((struct Point*) points).y +Rewriting struct pointer member access *((struct Point*) points).y +Rewriting struct pointer member access *((struct Point*) points).x +Rewriting struct pointer member access *((struct Point*) points).y +Adding pointer type conversion cast (struct Point*) points in (struct Point*) points ← (number) $1000 +Adding pointer type conversion cast (byte*) main::SCREEN in (byte*) main::SCREEN ← (number) $400 +Identified constant variable (struct Point*) points + +CONTROL FLOW GRAPH SSA +@begin: scope:[] from + (struct Point*) points#0 ← ((struct Point*)) (number) $1000 + to:@1 +main: scope:[main] from @1 + (byte*) main::$0 ← (byte*)(struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X + (byte*) main::$1 ← (byte*)(struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X + *((byte*) main::$1) ← *((byte*) main::$0) + (number) 5 + (byte*) main::$2 ← (byte*)(struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y + (byte*) main::$3 ← (byte*)(struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y + *((byte*) main::$3) ← *((byte*) main::$2) + (number) 5 + (byte*) main::SCREEN#0 ← ((byte*)) (number) $400 + (byte*) main::$4 ← (byte*)(struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X + *((byte*) main::SCREEN#0 + (number) 0) ← *((byte*) main::$4) + (byte*) main::$5 ← (byte*)(struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y + *((byte*) main::SCREEN#0 + (number) 1) ← *((byte*) main::$5) + 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) OFFSET_STRUCT_POINT_X = (byte) 0 +(const byte) OFFSET_STRUCT_POINT_Y = (byte) 1 +(byte) Point::x +(byte) Point::y +(void()) main() +(byte*) main::$0 +(byte*) main::$1 +(byte*) main::$2 +(byte*) main::$3 +(byte*) main::$4 +(byte*) main::$5 +(label) main::@return +(byte*) main::SCREEN +(byte*) main::SCREEN#0 +(struct Point*) points +(struct Point*) points#0 + +Adding number conversion cast (unumber) 5 in *((byte*) main::$1) ← *((byte*) main::$0) + (number) 5 +Adding number conversion cast (unumber) 5 in *((byte*) main::$3) ← *((byte*) main::$2) + (number) 5 +Adding number conversion cast (unumber) 0 in *((byte*) main::SCREEN#0 + (number) 0) ← *((byte*) main::$4) +Adding number conversion cast (unumber) 1 in *((byte*) main::SCREEN#0 + (number) 1) ← *((byte*) main::$5) +Successful SSA optimization PassNAddNumberTypeConversions +Inlining cast (struct Point*) points#0 ← (struct Point*)(number) $1000 +Inlining cast (byte*) main::SCREEN#0 ← (byte*)(number) $400 +Successful SSA optimization Pass2InlineCast +Simplifying constant pointer cast (struct Point*) 4096 +Simplifying constant integer cast 5 +Simplifying constant integer cast 5 +Simplifying constant pointer cast (byte*) 1024 +Simplifying constant integer cast 0 +Simplifying constant integer cast 1 +Successful SSA optimization PassNCastSimplification +Finalized unsigned number type (byte) 5 +Finalized unsigned number type (byte) 5 +Finalized unsigned number type (byte) 0 +Finalized unsigned number type (byte) 1 +Successful SSA optimization PassNFinalizeNumberTypeConversions +Constant (const struct Point*) points#0 = (struct Point*) 4096 +Constant (const byte*) main::SCREEN#0 = (byte*) 1024 +Successful SSA optimization Pass2ConstantIdentification +Constant value identified (byte*)points#0 in [1] (byte*) main::$0 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X +Constant value identified (byte*)points#0 in [2] (byte*) main::$1 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X +Constant value identified (byte*)points#0 in [4] (byte*) main::$2 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y +Constant value identified (byte*)points#0 in [5] (byte*) main::$3 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y +Constant value identified (byte*)points#0 in [8] (byte*) main::$4 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X +Constant value identified (byte*)points#0 in [10] (byte*) main::$5 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y +Successful SSA optimization Pass2ConstantValues +Converting *(pointer+n) to pointer[n] [3] *((byte*) main::$1) ← *((byte*) main::$0) + (byte) 5 -- *((byte*)points#0 + OFFSET_STRUCT_POINT_X) +Converting *(pointer+n) to pointer[n] [3] *((byte*) main::$1) ← *((byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X) + (byte) 5 -- *((byte*)points#0 + OFFSET_STRUCT_POINT_X) +Converting *(pointer+n) to pointer[n] [6] *((byte*) main::$3) ← *((byte*) main::$2) + (byte) 5 -- *((byte*)points#0 + OFFSET_STRUCT_POINT_Y) +Converting *(pointer+n) to pointer[n] [6] *((byte*) main::$3) ← *((byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 -- *((byte*)points#0 + OFFSET_STRUCT_POINT_Y) +Converting *(pointer+n) to pointer[n] [9] *((const byte*) main::SCREEN#0 + (byte) 0) ← *((byte*) main::$4) -- *((byte*)points#0 + OFFSET_STRUCT_POINT_X) +Converting *(pointer+n) to pointer[n] [11] *((const byte*) main::SCREEN#0 + (byte) 1) ← *((byte*) main::$5) -- *((byte*)points#0 + OFFSET_STRUCT_POINT_Y) +Successful SSA optimization Pass2InlineDerefIdx +Simplifying expression containing zero (byte*)points#0 in [1] (byte*) main::$0 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X +Simplifying expression containing zero (byte*)points#0 in [2] (byte*) main::$1 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X +Simplifying expression containing zero (byte*)points#0 in [3] *((byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X) ← *((byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X) + (byte) 5 +Simplifying expression containing zero (byte*)points#0 in [3] *((byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X) ← *((byte*)(const struct Point*) points#0) + (byte) 5 +Simplifying expression containing zero (byte*)points#0 in [8] (byte*) main::$4 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X +Simplifying expression containing zero (byte*)points#0 in [9] *((const byte*) main::SCREEN#0 + (byte) 0) ← *((byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_X) +Simplifying expression containing zero main::SCREEN#0 in [9] *((const byte*) main::SCREEN#0 + (byte) 0) ← *((byte*)(const struct Point*) points#0) +Successful SSA optimization PassNSimplifyExpressionWithZero +Eliminating unused variable (byte*) main::$0 and assignment [0] (byte*) main::$0 ← (byte*)(const struct Point*) points#0 +Eliminating unused variable (byte*) main::$1 and assignment [1] (byte*) main::$1 ← (byte*)(const struct Point*) points#0 +Eliminating unused variable (byte*) main::$2 and assignment [3] (byte*) main::$2 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y +Eliminating unused variable (byte*) main::$3 and assignment [4] (byte*) main::$3 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y +Eliminating unused variable (byte*) main::$4 and assignment [6] (byte*) main::$4 ← (byte*)(const struct Point*) points#0 +Eliminating unused variable (byte*) main::$5 and assignment [8] (byte*) main::$5 ← (byte*)(const struct Point*) points#0 + (const byte) OFFSET_STRUCT_POINT_Y +Eliminating unused constant (const byte) OFFSET_STRUCT_POINT_X +Successful SSA optimization PassNEliminateUnusedVars +Consolidated array index constant in *((byte*)points#0+OFFSET_STRUCT_POINT_Y) +Consolidated array index constant in *((byte*)points#0+OFFSET_STRUCT_POINT_Y) +Consolidated array index constant in *((byte*)points#0+OFFSET_STRUCT_POINT_Y) +Consolidated array index constant in *(main::SCREEN#0+1) +Successful SSA optimization Pass2ConstantAdditionElimination +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] *((byte*)(const struct Point*) points#0) ← *((byte*)(const struct Point*) points#0) + (byte) 5 + [5] *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 + [6] *((const byte*) main::SCREEN#0) ← *((byte*)(const struct Point*) points#0) + [7] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + to:main::@return +main::@return: scope:[main] from main + [8] return + to:@return + + +VARIABLE REGISTER WEIGHTS +(byte) Point::x +(byte) Point::y +(void()) main() +(byte*) main::SCREEN +(struct Point*) points + +Initial phi equivalence classes +Complete equivalence classes + +INITIAL ASM +//SEG0 File Comments +// Minimal struct - modifying pointer to struct in memory using arrow operator +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const OFFSET_STRUCT_POINT_Y = 1 + .label points = $1000 +//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] *((byte*)(const struct Point*) points#0) ← *((byte*)(const struct Point*) points#0) + (byte) 5 -- _deref_pbuc1=_deref_pbuc1_plus_vbuc2 + lda #5 + clc + adc points + sta points + //SEG11 [5] *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 -- _deref_pbuc1=_deref_pbuc2_plus_vbuc3 + lda #5 + clc + adc points+OFFSET_STRUCT_POINT_Y + sta points+OFFSET_STRUCT_POINT_Y + //SEG12 [6] *((const byte*) main::SCREEN#0) ← *((byte*)(const struct Point*) points#0) -- _deref_pbuc1=_deref_pbuc2 + lda points + sta SCREEN + //SEG13 [7] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) -- _deref_pbuc1=_deref_pbuc2 + lda points+OFFSET_STRUCT_POINT_Y + sta SCREEN+1 + jmp breturn + //SEG14 main::@return + breturn: + //SEG15 [8] return + rts +} + +REGISTER UPLIFT POTENTIAL REGISTERS +Statement [4] *((byte*)(const struct Point*) points#0) ← *((byte*)(const struct Point*) points#0) + (byte) 5 [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [5] *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [6] *((const byte*) main::SCREEN#0) ← *((byte*)(const struct Point*) points#0) [ ] ( main:2 [ ] ) always clobbers reg byte a +Statement [7] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) [ ] ( main:2 [ ] ) always clobbers reg byte a + +REGISTER UPLIFT SCOPES +Uplift Scope [Point] +Uplift Scope [main] +Uplift Scope [] + +Uplifting [Point] best 61 combination +Uplifting [main] best 61 combination +Uplifting [] best 61 combination + +ASSEMBLER BEFORE OPTIMIZATION +//SEG0 File Comments +// Minimal struct - modifying pointer to struct in memory using arrow operator +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(bbegin) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const OFFSET_STRUCT_POINT_Y = 1 + .label points = $1000 +//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] *((byte*)(const struct Point*) points#0) ← *((byte*)(const struct Point*) points#0) + (byte) 5 -- _deref_pbuc1=_deref_pbuc1_plus_vbuc2 + lda #5 + clc + adc points + sta points + //SEG11 [5] *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 -- _deref_pbuc1=_deref_pbuc2_plus_vbuc3 + lda #5 + clc + adc points+OFFSET_STRUCT_POINT_Y + sta points+OFFSET_STRUCT_POINT_Y + //SEG12 [6] *((const byte*) main::SCREEN#0) ← *((byte*)(const struct Point*) points#0) -- _deref_pbuc1=_deref_pbuc2 + lda points + sta SCREEN + //SEG13 [7] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) -- _deref_pbuc1=_deref_pbuc2 + lda points+OFFSET_STRUCT_POINT_Y + sta SCREEN+1 + jmp breturn + //SEG14 main::@return + breturn: + //SEG15 [8] 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) OFFSET_STRUCT_POINT_Y OFFSET_STRUCT_POINT_Y = (byte) 1 +(byte) Point::x +(byte) Point::y +(void()) main() +(label) main::@return +(byte*) main::SCREEN +(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(struct Point*) points +(const struct Point*) points#0 points = (struct Point*) 4096 + + + +FINAL ASSEMBLER +Score: 46 + +//SEG0 File Comments +// Minimal struct - modifying pointer to struct in memory using arrow operator +//SEG1 Basic Upstart +.pc = $801 "Basic" +:BasicUpstart(main) +.pc = $80d "Program" +//SEG2 Global Constants & labels + .const OFFSET_STRUCT_POINT_Y = 1 + .label points = $1000 +//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] *((byte*)(const struct Point*) points#0) ← *((byte*)(const struct Point*) points#0) + (byte) 5 -- _deref_pbuc1=_deref_pbuc1_plus_vbuc2 + lda #5 + clc + adc points + sta points + //SEG11 [5] *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) + (byte) 5 -- _deref_pbuc1=_deref_pbuc2_plus_vbuc3 + lda #5 + clc + adc points+OFFSET_STRUCT_POINT_Y + sta points+OFFSET_STRUCT_POINT_Y + //SEG12 [6] *((const byte*) main::SCREEN#0) ← *((byte*)(const struct Point*) points#0) -- _deref_pbuc1=_deref_pbuc2 + lda points + sta SCREEN + //SEG13 [7] *((const byte*) main::SCREEN#0+(byte) 1) ← *((byte*)(const struct Point*) points#0+(const byte) OFFSET_STRUCT_POINT_Y) -- _deref_pbuc1=_deref_pbuc2 + lda points+OFFSET_STRUCT_POINT_Y + sta SCREEN+1 + //SEG14 main::@return + //SEG15 [8] return + rts +} + diff --git a/src/test/ref/struct-ptr-13.sym b/src/test/ref/struct-ptr-13.sym new file mode 100644 index 000000000..bee0e3826 --- /dev/null +++ b/src/test/ref/struct-ptr-13.sym @@ -0,0 +1,13 @@ +(label) @1 +(label) @begin +(label) @end +(const byte) OFFSET_STRUCT_POINT_Y OFFSET_STRUCT_POINT_Y = (byte) 1 +(byte) Point::x +(byte) Point::y +(void()) main() +(label) main::@return +(byte*) main::SCREEN +(const byte*) main::SCREEN#0 SCREEN = (byte*) 1024 +(struct Point*) points +(const struct Point*) points#0 points = (struct Point*) 4096 +