From 689e0e1e97eacceba6d83a15f21d523749a6f813 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Mon, 14 Oct 2019 01:07:01 +0200 Subject: [PATCH] Improved struct value unwinding. --- .../kickc/passes/Pass1UnwindStructValues.java | 6 ++- src/test/ref/declared-memory-var-4.cfg | 2 +- src/test/ref/declared-memory-var-4.log | 42 +++++++++---------- src/test/ref/declared-memory-var-4.sym | 5 +-- 4 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java index d4af2372e..ca5895841 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java @@ -225,8 +225,10 @@ public class Pass1UnwindStructValues extends Pass1Base { memberVariable.setInferedVolatile(variable.isInferedVolatile()); memberVariable.setDeclaredConstant(variable.isDeclaredConstant()); memberVariable.setDeclaredExport(variable.isDeclaredExport()); - if(variable.isStorageLoadStore() && member.isStoragePhiMaster()) { - memberVariable.setStorageStrategy(variable.getStorageStrategy()); + memberVariable.setStorageStrategy(variable.getStorageStrategy()); + if(memberVariable.getType() instanceof SymbolTypePointer) { + memberVariable.setMemoryArea(SymbolVariable.MemoryArea.ZEROPAGE_MEMORY); + } else { memberVariable.setMemoryArea(variable.getMemoryArea()); } variableUnwinding.setMemberUnwinding(member.getLocalName(), memberVariable.getRef()); diff --git a/src/test/ref/declared-memory-var-4.cfg b/src/test/ref/declared-memory-var-4.cfg index ee1f82c30..6ff15d9be 100644 --- a/src/test/ref/declared-memory-var-4.cfg +++ b/src/test/ref/declared-memory-var-4.cfg @@ -1,7 +1,7 @@ @begin: scope:[] from [0] (byte) bar_thing1 ← (byte) 'a' [1] (byte) bar_thing2 ← (byte) 'b' - [2] (byte[$c]) bar_thing3#0 ← (const string) $0 + [2] (byte[$c]) bar_thing3 ← (const string) $0 to:@1 @1: scope:[] from @begin [3] phi() diff --git a/src/test/ref/declared-memory-var-4.log b/src/test/ref/declared-memory-var-4.log index 36d189d43..762f2fd26 100644 --- a/src/test/ref/declared-memory-var-4.log +++ b/src/test/ref/declared-memory-var-4.log @@ -17,8 +17,8 @@ CONTROL FLOW GRAPH SSA @begin: scope:[] from (byte) bar_thing1 ← (byte) 'a' (byte) bar_thing2 ← (byte) 'b' - (byte[$c]) bar_thing3#0 ← (const string) $0 - (struct foo) bar ← struct-unwound {(byte) bar_thing1, (byte) bar_thing2, (byte[$c]) bar_thing3#0} + (byte[$c]) bar_thing3 ← (const string) $0 + (struct foo) bar ← struct-unwound {(byte) bar_thing1, (byte) bar_thing2, (byte[$c]) bar_thing3} to:@1 (void()) main() @@ -68,8 +68,7 @@ SYMBOL TABLE SSA (struct foo) bar notregister (byte) bar_thing1 notregister (byte) bar_thing2 notregister -(byte[$c]) bar_thing3 -(byte[$c]) bar_thing3#0 +(byte[$c]) bar_thing3 notregister (byte) foo::thing1 (byte) foo::thing2 (byte[$c]) foo::thing3 @@ -132,7 +131,7 @@ Simplifying expression containing zero (byte*)main::barp#0 in [8] (byte*) main:: Simplifying expression containing zero (byte*)main::barp#0 in [9] *((const byte*) main::SCREEN + (const byte) main::i#0) ← *((byte*)(const struct foo*) main::barp#0 + (const byte) OFFSET_STRUCT_FOO_THING1) Simplifying expression containing zero main::SCREEN in [9] *((const byte*) main::SCREEN + (const byte) main::i#0) ← *((byte*)(const struct foo*) main::barp#0) Successful SSA optimization PassNSimplifyExpressionWithZero -Eliminating unused variable (struct foo) bar and assignment [3] (struct foo) bar ← struct-unwound {(byte) bar_thing1, (byte) bar_thing2, (byte[$c]) bar_thing3#0} +Eliminating unused variable (struct foo) bar and assignment [3] (struct foo) bar ← struct-unwound {(byte) bar_thing1, (byte) bar_thing2, (byte[$c]) bar_thing3} Eliminating unused variable (byte*) main::$2 and assignment [4] (byte*) main::$2 ← (byte*)(const struct foo*) main::barp#0 Eliminating unused variable (byte*) main::$3 and assignment [7] (byte*) main::$3 ← (byte*)(const struct foo*) main::barp#0 + (const byte) OFFSET_STRUCT_FOO_THING2 Eliminating unused constant (const byte) OFFSET_STRUCT_FOO_THING1 @@ -191,7 +190,7 @@ FINAL CONTROL FLOW GRAPH @begin: scope:[] from [0] (byte) bar_thing1 ← (byte) 'a' [1] (byte) bar_thing2 ← (byte) 'b' - [2] (byte[$c]) bar_thing3#0 ← (const string) $0 + [2] (byte[$c]) bar_thing3 ← (const string) $0 to:@1 @1: scope:[] from @begin [3] phi() @@ -221,8 +220,7 @@ main::@return: scope:[main] from main::@1 VARIABLE REGISTER WEIGHTS (byte) bar_thing1 notregister 20.0 (byte) bar_thing2 notregister 20.0 -(byte[$c]) bar_thing3 -(byte[$c]) bar_thing3#0 20.0 +(byte[$c]) bar_thing3 notregister 20.0 (byte) foo::thing1 (byte) foo::thing2 (byte[$c]) foo::thing3 @@ -240,17 +238,18 @@ Initial phi equivalence classes [ main::i#4 main::i#3 ] Added variable bar_thing1 to zero page equivalence class [ bar_thing1 ] Added variable bar_thing2 to zero page equivalence class [ bar_thing2 ] +Added variable bar_thing3 to zero page equivalence class [ bar_thing3 ] Complete equivalence classes [ main::j#2 main::j#1 ] [ main::i#4 main::i#3 ] -[ bar_thing3#0 ] [ bar_thing1 ] [ bar_thing2 ] +[ bar_thing3 ] Allocated zp[1]:2 [ main::j#2 main::j#1 ] Allocated zp[1]:3 [ main::i#4 main::i#3 ] -Allocated zp[2]:4 [ bar_thing3#0 ] Allocated mem[1]:bar_thing1 [ bar_thing1 ] Allocated mem[1]:bar_thing2 [ bar_thing2 ] +Allocated zp[2]:4 [ bar_thing3 ] INITIAL ASM Target platform is c64basic / MOS6502X @@ -273,7 +272,7 @@ __bbegin: // [1] (byte) bar_thing2 ← (byte) 'b' -- vbum1=vbuc1 lda #'b' sta bar_thing2 - // [2] (byte[$c]) bar_thing3#0 ← (const string) $0 -- pbuz1=pbuc1 + // [2] (byte[$c]) bar_thing3 ← (const string) $0 -- pbuz1=pbuc1 lda #<__0 sta.z bar_thing3 lda #>__0 @@ -346,7 +345,7 @@ main: { REGISTER UPLIFT POTENTIAL REGISTERS Statement [0] (byte) bar_thing1 ← (byte) 'a' [ ] ( [ ] ) always clobbers reg byte a Statement [1] (byte) bar_thing2 ← (byte) 'b' [ ] ( [ ] ) always clobbers reg byte a -Statement [2] (byte[$c]) bar_thing3#0 ← (const string) $0 [ ] ( [ ] ) always clobbers reg byte a +Statement [2] (byte[$c]) bar_thing3 ← (const string) $0 [ ] ( [ ] ) always clobbers reg byte a Statement [6] *((const byte*) main::SCREEN) ← *((byte*)(const struct foo*) main::barp#0) [ ] ( main:4 [ ] ) always clobbers reg byte a Statement [7] *((const byte*) main::SCREEN+(byte) 1) ← *((byte*)(const struct foo*) main::barp#0+(const byte) OFFSET_STRUCT_FOO_THING2) [ ] ( main:4 [ ] ) always clobbers reg byte a Statement [9] *((const byte*) main::SCREEN + (byte) main::i#4) ← *((byte[$c])(const struct foo*) main::barp#0+(const byte) OFFSET_STRUCT_FOO_THING3 + (byte) main::j#2) [ main::j#2 main::i#4 ] ( main:4 [ main::j#2 main::i#4 ] ) always clobbers reg byte a @@ -354,25 +353,25 @@ Removing always clobbered register reg byte a as potential for zp[1]:2 [ main::j Removing always clobbered register reg byte a as potential for zp[1]:3 [ main::i#4 main::i#3 ] Statement [0] (byte) bar_thing1 ← (byte) 'a' [ ] ( [ ] ) always clobbers reg byte a Statement [1] (byte) bar_thing2 ← (byte) 'b' [ ] ( [ ] ) always clobbers reg byte a -Statement [2] (byte[$c]) bar_thing3#0 ← (const string) $0 [ ] ( [ ] ) always clobbers reg byte a +Statement [2] (byte[$c]) bar_thing3 ← (const string) $0 [ ] ( [ ] ) always clobbers reg byte a Statement [6] *((const byte*) main::SCREEN) ← *((byte*)(const struct foo*) main::barp#0) [ ] ( main:4 [ ] ) always clobbers reg byte a Statement [7] *((const byte*) main::SCREEN+(byte) 1) ← *((byte*)(const struct foo*) main::barp#0+(const byte) OFFSET_STRUCT_FOO_THING2) [ ] ( main:4 [ ] ) always clobbers reg byte a Statement [9] *((const byte*) main::SCREEN + (byte) main::i#4) ← *((byte[$c])(const struct foo*) main::barp#0+(const byte) OFFSET_STRUCT_FOO_THING3 + (byte) main::j#2) [ main::j#2 main::i#4 ] ( main:4 [ main::j#2 main::i#4 ] ) always clobbers reg byte a Potential registers zp[1]:2 [ main::j#2 main::j#1 ] : zp[1]:2 , reg byte x , reg byte y , Potential registers zp[1]:3 [ main::i#4 main::i#3 ] : zp[1]:3 , reg byte x , reg byte y , -Potential registers zp[2]:4 [ bar_thing3#0 ] : zp[2]:4 , Potential registers mem[1]:bar_thing1 [ bar_thing1 ] : mem[1]:bar_thing1 , Potential registers mem[1]:bar_thing2 [ bar_thing2 ] : mem[1]:bar_thing2 , +Potential registers zp[2]:4 [ bar_thing3 ] : zp[2]:4 , REGISTER UPLIFT SCOPES -Uplift Scope [] 20: zp[2]:4 [ bar_thing3#0 ] 20: mem[1]:bar_thing1 [ bar_thing1 ] 20: mem[1]:bar_thing2 [ bar_thing2 ] +Uplift Scope [] 20: mem[1]:bar_thing1 [ bar_thing1 ] 20: mem[1]:bar_thing2 [ bar_thing2 ] 20: zp[2]:4 [ bar_thing3 ] Uplift Scope [main] 27.5: zp[1]:2 [ main::j#2 main::j#1 ] 23.83: zp[1]:3 [ main::i#4 main::i#3 ] Uplift Scope [foo] -Uplifting [] best 576 combination zp[2]:4 [ bar_thing3#0 ] mem[1]:bar_thing1 [ bar_thing1 ] mem[1]:bar_thing2 [ bar_thing2 ] +Uplifting [] best 576 combination mem[1]:bar_thing1 [ bar_thing1 ] mem[1]:bar_thing2 [ bar_thing2 ] zp[2]:4 [ bar_thing3 ] Uplifting [main] best 366 combination reg byte y [ main::j#2 main::j#1 ] reg byte x [ main::i#4 main::i#3 ] Uplifting [foo] best 366 combination -Allocated (was zp[2]:4) zp[2]:2 [ bar_thing3#0 ] +Allocated (was zp[2]:4) zp[2]:2 [ bar_thing3 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -394,7 +393,7 @@ __bbegin: // [1] (byte) bar_thing2 ← (byte) 'b' -- vbum1=vbuc1 lda #'b' sta bar_thing2 - // [2] (byte[$c]) bar_thing3#0 ← (const string) $0 -- pbuz1=pbuc1 + // [2] (byte[$c]) bar_thing3 ← (const string) $0 -- pbuz1=pbuc1 lda #<__0 sta.z bar_thing3 lda #>__0 @@ -487,8 +486,7 @@ FINAL SYMBOL TABLE (const byte) OFFSET_STRUCT_FOO_THING3 = (byte) 2 (byte) bar_thing1 notregister mem[1]:bar_thing1 20.0 (byte) bar_thing2 notregister mem[1]:bar_thing2 20.0 -(byte[$c]) bar_thing3 -(byte[$c]) bar_thing3#0 bar_thing3 zp[2]:2 20.0 +(byte[$c]) bar_thing3 notregister zp[2]:2 20.0 (byte) foo::thing1 (byte) foo::thing2 (byte[$c]) foo::thing3 @@ -507,9 +505,9 @@ FINAL SYMBOL TABLE reg byte y [ main::j#2 main::j#1 ] reg byte x [ main::i#4 main::i#3 ] -zp[2]:2 [ bar_thing3#0 ] mem[1]:bar_thing1 [ bar_thing1 ] mem[1]:bar_thing2 [ bar_thing2 ] +zp[2]:2 [ bar_thing3 ] FINAL ASSEMBLER @@ -535,7 +533,7 @@ __bbegin: // [1] (byte) bar_thing2 ← (byte) 'b' -- vbum1=vbuc1 lda #'b' sta bar_thing2 - // [2] (byte[$c]) bar_thing3#0 ← (const string) $0 -- pbuz1=pbuc1 + // [2] (byte[$c]) bar_thing3 ← (const string) $0 -- pbuz1=pbuc1 lda #<__0 sta.z bar_thing3 lda #>__0 diff --git a/src/test/ref/declared-memory-var-4.sym b/src/test/ref/declared-memory-var-4.sym index 82a7738dc..27b864eb2 100644 --- a/src/test/ref/declared-memory-var-4.sym +++ b/src/test/ref/declared-memory-var-4.sym @@ -6,8 +6,7 @@ (const byte) OFFSET_STRUCT_FOO_THING3 = (byte) 2 (byte) bar_thing1 notregister mem[1]:bar_thing1 20.0 (byte) bar_thing2 notregister mem[1]:bar_thing2 20.0 -(byte[$c]) bar_thing3 -(byte[$c]) bar_thing3#0 bar_thing3 zp[2]:2 20.0 +(byte[$c]) bar_thing3 notregister zp[2]:2 20.0 (byte) foo::thing1 (byte) foo::thing2 (byte[$c]) foo::thing3 @@ -26,6 +25,6 @@ reg byte y [ main::j#2 main::j#1 ] reg byte x [ main::i#4 main::i#3 ] -zp[2]:2 [ bar_thing3#0 ] mem[1]:bar_thing1 [ bar_thing1 ] mem[1]:bar_thing2 [ bar_thing2 ] +zp[2]:2 [ bar_thing3 ]