diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java index c5a6be49a..ead0111ec 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java @@ -5,11 +5,9 @@ import dk.camelot64.kickc.asm.AsmProgram; import dk.camelot64.kickc.fragment.AsmFragmentInstance; import dk.camelot64.kickc.fragment.AsmFragmentTemplateSynthesizer; import dk.camelot64.kickc.model.*; +import dk.camelot64.kickc.model.statements.*; import dk.camelot64.kickc.model.values.LValue; import dk.camelot64.kickc.model.values.VariableRef; -import dk.camelot64.kickc.model.statements.Statement; -import dk.camelot64.kickc.model.statements.StatementAssignment; -import dk.camelot64.kickc.model.statements.StatementPhiBlock; import java.util.*; @@ -39,8 +37,8 @@ public class Pass4RegisterUpliftPotentialRegisterAnalysis extends Pass2Base { variableRefs.add(phiVariable.getVariable()); } return variableRefs; - } else if(statement instanceof StatementAssignment) { - LValue lValue = ((StatementAssignment) statement).getlValue(); + } else if(statement instanceof StatementLValue) { + LValue lValue = ((StatementLValue) statement).getlValue(); if(lValue instanceof VariableRef) { variableRefs.add((VariableRef) lValue); } diff --git a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java index 34cfcf980..9ae8ceaf7 100644 --- a/src/test/java/dk/camelot64/kickc/test/TestPrograms.java +++ b/src/test/java/dk/camelot64/kickc/test/TestPrograms.java @@ -57,7 +57,7 @@ public class TestPrograms { @Test public void testProcedureCallingConventionStack0() throws IOException, URISyntaxException { - compileAndCompare("procedure-callingconvention-stack-0"); //, log().verboseCreateSsa().verboseParse().verboseStatementSequence().verboseUplift().verboseLiveRanges().verboseSSAOptimize()); + compileAndCompare("procedure-callingconvention-stack-0"); } @Test diff --git a/src/test/ref/procedure-callingconvention-stack-0.asm b/src/test/ref/procedure-callingconvention-stack-0.asm index f770b0722..b061638cc 100644 --- a/src/test/ref/procedure-callingconvention-stack-0.asm +++ b/src/test/ref/procedure-callingconvention-stack-0.asm @@ -5,7 +5,6 @@ .label SCREEN = $400 .const STACK_BASE = $103 main: { - .label _0 = 2 lda #'0' pha lda #7 @@ -13,7 +12,6 @@ main: { jsr plus pla pla - sta.z _0 sta SCREEN rts } diff --git a/src/test/ref/procedure-callingconvention-stack-0.log b/src/test/ref/procedure-callingconvention-stack-0.log index 49790fbe9..121a292ec 100644 --- a/src/test/ref/procedure-callingconvention-stack-0.log +++ b/src/test/ref/procedure-callingconvention-stack-0.log @@ -262,14 +262,11 @@ Uplift Scope [main] 2: zp ZP_BYTE:2 [ main::$0 ] Uplift Scope [] Uplifting [plus] best 84 combination reg byte a [ plus::b#0 ] zp ZP_BYTE:3 [ plus::a#0 ] reg byte a [ plus::return#0 ] -Uplifting [main] best 84 combination zp ZP_BYTE:2 [ main::$0 ] -Uplifting [] best 84 combination -Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::$0 ] -Uplifting [main] best 84 combination zp ZP_BYTE:2 [ main::$0 ] +Uplifting [main] best 78 combination reg byte a [ main::$0 ] +Uplifting [] best 78 combination Attempting to uplift remaining variables inzp ZP_BYTE:3 [ plus::a#0 ] -Uplifting [plus] best 84 combination zp ZP_BYTE:3 [ plus::a#0 ] -Coalescing zero page register [ zp ZP_BYTE:3 [ plus::a#0 ] ] with [ zp ZP_BYTE:2 [ main::$0 ] ] -Allocated (was zp ZP_BYTE:3) zp ZP_BYTE:2 [ plus::a#0 main::$0 ] +Uplifting [plus] best 78 combination zp ZP_BYTE:3 [ plus::a#0 ] +Allocated (was zp ZP_BYTE:3) zp ZP_BYTE:2 [ plus::a#0 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -299,7 +296,6 @@ bend_from_b1: bend: // main main: { - .label _0 = 2 // [5] callprepare plus (byte) '0' (byte) 7 // [5] callprepare plus (byte) '0' (byte) 7 -- _stackpushbyte_=vbuc1 lda #'0' @@ -313,11 +309,9 @@ main: { // [7] (byte~) main::$0 ← callfinalize plus // [7] (byte~) main::$0 ← callfinalize plus -- _stackpullbyte_1 pla - // [7] (byte~) main::$0 ← callfinalize plus -- vbuz1=_stackpullbyte_ + // [7] (byte~) main::$0 ← callfinalize plus -- vbuaa=_stackpullbyte_ pla - sta.z _0 - // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuz1 - lda.z _0 + // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuaa sta SCREEN jmp breturn // main::@return @@ -355,8 +349,6 @@ Removing instruction jmp bend Removing instruction jmp breturn Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination -Removing instruction lda.z _0 -Succesful ASM optimization Pass5UnnecesaryLoadElimination Removing instruction b1_from_bbegin: Removing instruction b1: Removing instruction main_from_b1: @@ -380,7 +372,7 @@ FINAL SYMBOL TABLE (const byte*) SCREEN#0 SCREEN = (byte*) 1024 (const word) STACK_BASE STACK_BASE = (word) $103 (void()) main() -(byte~) main::$0 $0 zp ZP_BYTE:2 2.0 +(byte~) main::$0 reg byte a 2.0 (label) main::@return __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (label) plus::@return @@ -393,13 +385,14 @@ __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (byte) plus::return (byte) plus::return#0 reg byte a 2.0 -zp ZP_BYTE:2 [ plus::a#0 main::$0 ] +reg byte a [ main::$0 ] +zp ZP_BYTE:2 [ plus::a#0 ] reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] FINAL ASSEMBLER -Score: 63 +Score: 60 // File Comments // Test a procedure with calling convention stack @@ -419,7 +412,6 @@ Score: 63 // @end // main main: { - .label _0 = 2 // plus('0', 7) // [5] callprepare plus (byte) '0' (byte) 7 // [5] callprepare plus (byte) '0' (byte) 7 -- _stackpushbyte_=vbuc1 @@ -434,11 +426,10 @@ main: { // [7] (byte~) main::$0 ← callfinalize plus // [7] (byte~) main::$0 ← callfinalize plus -- _stackpullbyte_1 pla - // [7] (byte~) main::$0 ← callfinalize plus -- vbuz1=_stackpullbyte_ + // [7] (byte~) main::$0 ← callfinalize plus -- vbuaa=_stackpullbyte_ pla - sta.z _0 // SCREEN[0] = plus('0', 7) - // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuz1 + // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuaa sta SCREEN // main::@return // } diff --git a/src/test/ref/procedure-callingconvention-stack-0.sym b/src/test/ref/procedure-callingconvention-stack-0.sym index 1d1338bbe..3f16225e7 100644 --- a/src/test/ref/procedure-callingconvention-stack-0.sym +++ b/src/test/ref/procedure-callingconvention-stack-0.sym @@ -5,7 +5,7 @@ (const byte*) SCREEN#0 SCREEN = (byte*) 1024 (const word) STACK_BASE STACK_BASE = (word) $103 (void()) main() -(byte~) main::$0 $0 zp ZP_BYTE:2 2.0 +(byte~) main::$0 reg byte a 2.0 (label) main::@return __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (label) plus::@return @@ -18,6 +18,7 @@ __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (byte) plus::return (byte) plus::return#0 reg byte a 2.0 -zp ZP_BYTE:2 [ plus::a#0 main::$0 ] +reg byte a [ main::$0 ] +zp ZP_BYTE:2 [ plus::a#0 ] reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] diff --git a/src/test/ref/procedure-callingconvention-stack-1.asm b/src/test/ref/procedure-callingconvention-stack-1.asm index f770b0722..b061638cc 100644 --- a/src/test/ref/procedure-callingconvention-stack-1.asm +++ b/src/test/ref/procedure-callingconvention-stack-1.asm @@ -5,7 +5,6 @@ .label SCREEN = $400 .const STACK_BASE = $103 main: { - .label _0 = 2 lda #'0' pha lda #7 @@ -13,7 +12,6 @@ main: { jsr plus pla pla - sta.z _0 sta SCREEN rts } diff --git a/src/test/ref/procedure-callingconvention-stack-1.log b/src/test/ref/procedure-callingconvention-stack-1.log index 49790fbe9..121a292ec 100644 --- a/src/test/ref/procedure-callingconvention-stack-1.log +++ b/src/test/ref/procedure-callingconvention-stack-1.log @@ -262,14 +262,11 @@ Uplift Scope [main] 2: zp ZP_BYTE:2 [ main::$0 ] Uplift Scope [] Uplifting [plus] best 84 combination reg byte a [ plus::b#0 ] zp ZP_BYTE:3 [ plus::a#0 ] reg byte a [ plus::return#0 ] -Uplifting [main] best 84 combination zp ZP_BYTE:2 [ main::$0 ] -Uplifting [] best 84 combination -Attempting to uplift remaining variables inzp ZP_BYTE:2 [ main::$0 ] -Uplifting [main] best 84 combination zp ZP_BYTE:2 [ main::$0 ] +Uplifting [main] best 78 combination reg byte a [ main::$0 ] +Uplifting [] best 78 combination Attempting to uplift remaining variables inzp ZP_BYTE:3 [ plus::a#0 ] -Uplifting [plus] best 84 combination zp ZP_BYTE:3 [ plus::a#0 ] -Coalescing zero page register [ zp ZP_BYTE:3 [ plus::a#0 ] ] with [ zp ZP_BYTE:2 [ main::$0 ] ] -Allocated (was zp ZP_BYTE:3) zp ZP_BYTE:2 [ plus::a#0 main::$0 ] +Uplifting [plus] best 78 combination zp ZP_BYTE:3 [ plus::a#0 ] +Allocated (was zp ZP_BYTE:3) zp ZP_BYTE:2 [ plus::a#0 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -299,7 +296,6 @@ bend_from_b1: bend: // main main: { - .label _0 = 2 // [5] callprepare plus (byte) '0' (byte) 7 // [5] callprepare plus (byte) '0' (byte) 7 -- _stackpushbyte_=vbuc1 lda #'0' @@ -313,11 +309,9 @@ main: { // [7] (byte~) main::$0 ← callfinalize plus // [7] (byte~) main::$0 ← callfinalize plus -- _stackpullbyte_1 pla - // [7] (byte~) main::$0 ← callfinalize plus -- vbuz1=_stackpullbyte_ + // [7] (byte~) main::$0 ← callfinalize plus -- vbuaa=_stackpullbyte_ pla - sta.z _0 - // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuz1 - lda.z _0 + // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuaa sta SCREEN jmp breturn // main::@return @@ -355,8 +349,6 @@ Removing instruction jmp bend Removing instruction jmp breturn Removing instruction jmp breturn Succesful ASM optimization Pass5NextJumpElimination -Removing instruction lda.z _0 -Succesful ASM optimization Pass5UnnecesaryLoadElimination Removing instruction b1_from_bbegin: Removing instruction b1: Removing instruction main_from_b1: @@ -380,7 +372,7 @@ FINAL SYMBOL TABLE (const byte*) SCREEN#0 SCREEN = (byte*) 1024 (const word) STACK_BASE STACK_BASE = (word) $103 (void()) main() -(byte~) main::$0 $0 zp ZP_BYTE:2 2.0 +(byte~) main::$0 reg byte a 2.0 (label) main::@return __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (label) plus::@return @@ -393,13 +385,14 @@ __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (byte) plus::return (byte) plus::return#0 reg byte a 2.0 -zp ZP_BYTE:2 [ plus::a#0 main::$0 ] +reg byte a [ main::$0 ] +zp ZP_BYTE:2 [ plus::a#0 ] reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] FINAL ASSEMBLER -Score: 63 +Score: 60 // File Comments // Test a procedure with calling convention stack @@ -419,7 +412,6 @@ Score: 63 // @end // main main: { - .label _0 = 2 // plus('0', 7) // [5] callprepare plus (byte) '0' (byte) 7 // [5] callprepare plus (byte) '0' (byte) 7 -- _stackpushbyte_=vbuc1 @@ -434,11 +426,10 @@ main: { // [7] (byte~) main::$0 ← callfinalize plus // [7] (byte~) main::$0 ← callfinalize plus -- _stackpullbyte_1 pla - // [7] (byte~) main::$0 ← callfinalize plus -- vbuz1=_stackpullbyte_ + // [7] (byte~) main::$0 ← callfinalize plus -- vbuaa=_stackpullbyte_ pla - sta.z _0 // SCREEN[0] = plus('0', 7) - // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuz1 + // [8] *((const byte*) SCREEN#0) ← (byte~) main::$0 -- _deref_pbuc1=vbuaa sta SCREEN // main::@return // } diff --git a/src/test/ref/procedure-callingconvention-stack-1.sym b/src/test/ref/procedure-callingconvention-stack-1.sym index 1d1338bbe..3f16225e7 100644 --- a/src/test/ref/procedure-callingconvention-stack-1.sym +++ b/src/test/ref/procedure-callingconvention-stack-1.sym @@ -5,7 +5,7 @@ (const byte*) SCREEN#0 SCREEN = (byte*) 1024 (const word) STACK_BASE STACK_BASE = (word) $103 (void()) main() -(byte~) main::$0 $0 zp ZP_BYTE:2 2.0 +(byte~) main::$0 reg byte a 2.0 (label) main::@return __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (label) plus::@return @@ -18,6 +18,7 @@ __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (byte) plus::return (byte) plus::return#0 reg byte a 2.0 -zp ZP_BYTE:2 [ plus::a#0 main::$0 ] +reg byte a [ main::$0 ] +zp ZP_BYTE:2 [ plus::a#0 ] reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] diff --git a/src/test/ref/procedure-callingconvention-stack-4.asm b/src/test/ref/procedure-callingconvention-stack-4.asm index e30da2ff6..cc0338948 100644 --- a/src/test/ref/procedure-callingconvention-stack-4.asm +++ b/src/test/ref/procedure-callingconvention-stack-4.asm @@ -6,7 +6,6 @@ .label SCREEN = $400 .const STACK_BASE = $103 main: { - .label w = 2 ldy #0 b1: tya @@ -19,10 +18,9 @@ main: { jsr plus pla pla - sta.z w - tya + sty.z $ff clc - adc.z w + adc.z $ff sta SCREEN iny cpy #2 diff --git a/src/test/ref/procedure-callingconvention-stack-4.log b/src/test/ref/procedure-callingconvention-stack-4.log index 7a3b632a4..3cb2fd89f 100644 --- a/src/test/ref/procedure-callingconvention-stack-4.log +++ b/src/test/ref/procedure-callingconvention-stack-4.log @@ -403,16 +403,13 @@ Uplift Scope [main] 22.79: zp ZP_BYTE:2 [ main::a#2 main::a#1 ] 22: zp ZP_BYTE:5 Uplift Scope [plus] 4: zp ZP_BYTE:7 [ plus::b#0 ] 2: zp ZP_BYTE:6 [ plus::a#0 ] 2: zp ZP_BYTE:8 [ plus::return#0 ] Uplift Scope [] -Uplifting [main] best 671 combination reg byte y [ main::a#2 main::a#1 ] reg byte a [ main::$2 ] reg byte x [ main::v#0 ] zp ZP_BYTE:4 [ main::w#0 ] +Uplifting [main] best 651 combination reg byte y [ main::a#2 main::a#1 ] reg byte a [ main::$2 ] reg byte x [ main::v#0 ] reg byte a [ main::w#0 ] Limited combination testing to 100 combinations of 128 possible. -Uplifting [plus] best 662 combination reg byte a [ plus::b#0 ] zp ZP_BYTE:6 [ plus::a#0 ] reg byte a [ plus::return#0 ] -Uplifting [] best 662 combination -Attempting to uplift remaining variables inzp ZP_BYTE:4 [ main::w#0 ] -Uplifting [main] best 662 combination zp ZP_BYTE:4 [ main::w#0 ] +Uplifting [plus] best 642 combination reg byte a [ plus::b#0 ] zp ZP_BYTE:6 [ plus::a#0 ] reg byte a [ plus::return#0 ] +Uplifting [] best 642 combination Attempting to uplift remaining variables inzp ZP_BYTE:6 [ plus::a#0 ] -Uplifting [plus] best 662 combination zp ZP_BYTE:6 [ plus::a#0 ] -Coalescing zero page register [ zp ZP_BYTE:6 [ plus::a#0 ] ] with [ zp ZP_BYTE:4 [ main::w#0 ] ] -Allocated (was zp ZP_BYTE:6) zp ZP_BYTE:2 [ plus::a#0 main::w#0 ] +Uplifting [plus] best 642 combination zp ZP_BYTE:6 [ plus::a#0 ] +Allocated (was zp ZP_BYTE:6) zp ZP_BYTE:2 [ plus::a#0 ] ASSEMBLER BEFORE OPTIMIZATION // File Comments @@ -443,7 +440,6 @@ bend_from_b1: bend: // main main: { - .label w = 2 // [5] phi from main to main::@1 [phi:main->main::@1] b1_from_main: // [5] phi (byte) main::a#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1 @@ -472,13 +468,12 @@ main: { // [9] (byte) main::w#0 ← callfinalize plus // [9] (byte) main::w#0 ← callfinalize plus -- _stackpullbyte_1 pla - // [9] (byte) main::w#0 ← callfinalize plus -- vbuz1=_stackpullbyte_ + // [9] (byte) main::w#0 ← callfinalize plus -- vbuaa=_stackpullbyte_ pla - sta.z w - // [10] (byte~) main::$2 ← (byte) main::w#0 + (byte) main::a#2 -- vbuaa=vbuz1_plus_vbuyy - tya + // [10] (byte~) main::$2 ← (byte) main::w#0 + (byte) main::a#2 -- vbuaa=vbuaa_plus_vbuyy + sty.z $ff clc - adc.z w + adc.z $ff // [11] *((const byte*) SCREEN#0) ← (byte~) main::$2 -- _deref_pbuc1=vbuaa sta SCREEN // [12] (byte) main::a#1 ← ++ (byte) main::a#2 -- vbuyy=_inc_vbuyy @@ -561,7 +556,7 @@ FINAL SYMBOL TABLE (byte) main::v (byte) main::v#0 reg byte x 11.0 (byte) main::w -(byte) main::w#0 w zp ZP_BYTE:2 11.0 +(byte) main::w#0 reg byte a 11.0 __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (label) plus::@return (const byte) plus::OFFSET_STACK_A OFFSET_STACK_A = (byte) 0 @@ -575,14 +570,15 @@ __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) reg byte y [ main::a#2 main::a#1 ] reg byte x [ main::v#0 ] +reg byte a [ main::w#0 ] reg byte a [ main::$2 ] -zp ZP_BYTE:2 [ plus::a#0 main::w#0 ] +zp ZP_BYTE:2 [ plus::a#0 ] reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ] FINAL ASSEMBLER -Score: 557 +Score: 537 // File Comments // Test a procedure with calling convention stack @@ -603,7 +599,6 @@ Score: 557 // @end // main main: { - .label w = 2 // [5] phi from main to main::@1 [phi:main->main::@1] // [5] phi (byte) main::a#2 = (byte) 0 [phi:main->main::@1#0] -- vbuyy=vbuc1 ldy #0 @@ -630,14 +625,13 @@ main: { // [9] (byte) main::w#0 ← callfinalize plus // [9] (byte) main::w#0 ← callfinalize plus -- _stackpullbyte_1 pla - // [9] (byte) main::w#0 ← callfinalize plus -- vbuz1=_stackpullbyte_ + // [9] (byte) main::w#0 ← callfinalize plus -- vbuaa=_stackpullbyte_ pla - sta.z w // w+a - // [10] (byte~) main::$2 ← (byte) main::w#0 + (byte) main::a#2 -- vbuaa=vbuz1_plus_vbuyy - tya + // [10] (byte~) main::$2 ← (byte) main::w#0 + (byte) main::a#2 -- vbuaa=vbuaa_plus_vbuyy + sty.z $ff clc - adc.z w + adc.z $ff // SCREEN[i] = w+a // [11] *((const byte*) SCREEN#0) ← (byte~) main::$2 -- _deref_pbuc1=vbuaa sta SCREEN diff --git a/src/test/ref/procedure-callingconvention-stack-4.sym b/src/test/ref/procedure-callingconvention-stack-4.sym index 5b2d1ff34..05f95ff24 100644 --- a/src/test/ref/procedure-callingconvention-stack-4.sym +++ b/src/test/ref/procedure-callingconvention-stack-4.sym @@ -15,7 +15,7 @@ (byte) main::v (byte) main::v#0 reg byte x 11.0 (byte) main::w -(byte) main::w#0 w zp ZP_BYTE:2 11.0 +(byte) main::w#0 reg byte a 11.0 __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) (label) plus::@return (const byte) plus::OFFSET_STACK_A OFFSET_STACK_A = (byte) 0 @@ -29,7 +29,8 @@ __stackcall (byte()) plus((byte) plus::a , (byte) plus::b) reg byte y [ main::a#2 main::a#1 ] reg byte x [ main::v#0 ] +reg byte a [ main::w#0 ] reg byte a [ main::$2 ] -zp ZP_BYTE:2 [ plus::a#0 main::w#0 ] +zp ZP_BYTE:2 [ plus::a#0 ] reg byte a [ plus::b#0 ] reg byte a [ plus::return#0 ]