From 6d39582e5ff1cb5a7e6c32d620eb2cccff416e10 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Sun, 25 Jul 2021 22:06:49 +0200 Subject: [PATCH] Working in classic structs. #197 --- .../java/dk/camelot64/kickc/Compiler.java | 20 +++++++++++-------- .../kickc/passes/Pass1UnwindStructValues.java | 7 +++++++ 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index 0a896f6bf..cf9c32b24 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -248,9 +248,11 @@ public class Compiler { new PassNAssertTypeMatch(program).check(); - new Pass1UnwindStructPrepare(program).execute(); - new Pass1UnwindStructVariables(program).execute(); - new Pass1UnwindStructValues(program).execute(); + if(!program.getTargetPlatform().getVariableBuilderConfig().isStructModelClassic()) { + new Pass1UnwindStructPrepare(program).execute(); + new Pass1UnwindStructVariables(program).execute(); + new Pass1UnwindStructValues(program).execute(); + } if(getLog().isVerbosePass1CreateSsa()) { getLog().append("CONTROL FLOW GRAPH AFTER UNWIND"); @@ -312,10 +314,9 @@ public class Compiler { new Pass1CallPhiReturn(program).execute(); new PassNUnwindLValueLists(program).execute(); - new Pass1UnwindStructValues(program).execute(); - new PassNStructUnwoundPlaceholderRemoval(program).execute(); - - + if(!program.getTargetPlatform().getVariableBuilderConfig().isStructModelClassic()) { + new PassNStructUnwoundPlaceholderRemoval(program).execute(); + } getLog().append("\nCONTROL FLOW GRAPH SSA"); getLog().append(program.getGraph().toString(program)); @@ -379,7 +380,6 @@ public class Compiler { optimizations.add(new Pass2ConditionalJumpSimplification(program)); optimizations.add(new Pass2ConditionalAndOrRewriting(program)); optimizations.add(new PassNAddBooleanCasts(program, false)); - optimizations.add(new PassNStructUnwoundPlaceholderRemoval(program)); optimizations.add(new PassNArrayElementAddressOfRewriting(program)); optimizations.add(new Pass2ConditionalJumpSequenceImprovement(program)); optimizations.add(new Pass2ConstantRValueConsolidation(program)); @@ -552,6 +552,10 @@ public class Compiler { private void pass3Analysis() { + if(program.getTargetPlatform().getVariableBuilderConfig().isStructModelClassic()) { + new PassNStructUnwoundPlaceholderRemoval(program).execute(); + } + if(getLog().isVerboseSizeInfo()) { getLog().append(program.getSizeInfo()); } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java index 5fe00ff2d..e7714e304 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1UnwindStructValues.java @@ -294,6 +294,13 @@ public class Pass1UnwindStructValues extends Pass1Base { program.getLog().append("Adding value simple copy " + copyStmt.toString(program, false)); return true; } else if(lValueSource.isBulkCopyable() && rValueSource.isBulkCopyable()) { + + /* TODO: Attempt to mix struct mode classic with unwinding + if(lValueSource instanceof ValueSourceVariable && rValueSource instanceof ValueSourceVariable) + if(((ValueSourceVariable) lValueSource).getVariable().isStructClassic() && ((ValueSourceVariable) rValueSource).getVariable().isStructClassic()) + return false; + */ + // Use bulk unwinding for a struct member that is an array stmtIt.previous(); if(lValueSource.getArraySpec() != null)