From 58500b39e0a8a9d70ffaa0536862a8532b7fc975 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Thu, 9 Nov 2017 23:28:21 +0100 Subject: [PATCH] Implemented a less verbose statement print for uplift performance --- src/main/java/dk/camelot64/kickc/Compiler.java | 4 ++-- .../dk/camelot64/kickc/model/ControlFlowBlock.java | 2 +- .../kickc/model/LiveRangeEquivalenceClassSet.java | 1 - src/main/java/dk/camelot64/kickc/model/Statement.java | 2 +- .../java/dk/camelot64/kickc/model/StatementAsm.java | 2 +- .../dk/camelot64/kickc/model/StatementAssignment.java | 6 +++--- .../java/dk/camelot64/kickc/model/StatementBase.java | 2 +- .../java/dk/camelot64/kickc/model/StatementCall.java | 6 ++++-- .../kickc/model/StatementConditionalJump.java | 6 ++++-- .../java/dk/camelot64/kickc/model/StatementJump.java | 4 ++-- .../java/dk/camelot64/kickc/model/StatementLabel.java | 4 ++-- .../dk/camelot64/kickc/model/StatementPhiBlock.java | 10 +++++++--- .../camelot64/kickc/model/StatementProcedureBegin.java | 4 ++-- .../camelot64/kickc/model/StatementProcedureEnd.java | 4 ++-- .../java/dk/camelot64/kickc/model/StatementReturn.java | 4 ++-- .../dk/camelot64/kickc/model/StatementSequence.java | 2 +- .../kickc/passes/Pass1GenerateStatementSequence.java | 2 +- .../passes/Pass2ConditionalJumpSimplification.java | 2 +- .../kickc/passes/Pass2UnaryNotSimplification.java | 2 +- .../dk/camelot64/kickc/passes/Pass4CodeGeneration.java | 10 ++++++---- .../kickc/passes/Pass4RegisterUpliftCombinations.java | 4 ++-- .../Pass4RegisterUpliftPotentialRegisterAnalysis.java | 6 +++--- 22 files changed, 49 insertions(+), 40 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index b331a7eee..bb8a099e6 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -244,7 +244,7 @@ public class Compiler { new Pass4RegistersFinalize(program).allocate(true); // Initial Code generation - new Pass4CodeGeneration(program).generate(); + new Pass4CodeGeneration(program, true).generate(); new Pass4AssertNoCpuClobber(program).check(); program.getLog().append("INITIAL ASM"); program.getLog().append(program.getAsm().toString()); @@ -284,7 +284,7 @@ public class Compiler { public void pass5GenerateAndOptimizeAsm(Program program) { // Final ASM code generation before optimization - new Pass4CodeGeneration(program).generate(); + new Pass4CodeGeneration(program, true).generate(); new Pass4AssertNoCpuClobber(program).check(); List pass5Optimizations = new ArrayList<>(); diff --git a/src/main/java/dk/camelot64/kickc/model/ControlFlowBlock.java b/src/main/java/dk/camelot64/kickc/model/ControlFlowBlock.java index 924fa4e01..49d345b55 100644 --- a/src/main/java/dk/camelot64/kickc/model/ControlFlowBlock.java +++ b/src/main/java/dk/camelot64/kickc/model/ControlFlowBlock.java @@ -136,7 +136,7 @@ public class ControlFlowBlock { } out.append("\n"); for (Statement statement : statements) { - out.append(" " + statement.toString(program) + "\n"); + out.append(" " + statement.toString(program, true) + "\n"); } if (defaultSuccessor != null) { out.append(" to:"); diff --git a/src/main/java/dk/camelot64/kickc/model/LiveRangeEquivalenceClassSet.java b/src/main/java/dk/camelot64/kickc/model/LiveRangeEquivalenceClassSet.java index 73aa1c2f9..d09e55631 100644 --- a/src/main/java/dk/camelot64/kickc/model/LiveRangeEquivalenceClassSet.java +++ b/src/main/java/dk/camelot64/kickc/model/LiveRangeEquivalenceClassSet.java @@ -74,5 +74,4 @@ public class LiveRangeEquivalenceClassSet { } } - } diff --git a/src/main/java/dk/camelot64/kickc/model/Statement.java b/src/main/java/dk/camelot64/kickc/model/Statement.java index c52eac56a..36d3ed65b 100644 --- a/src/main/java/dk/camelot64/kickc/model/Statement.java +++ b/src/main/java/dk/camelot64/kickc/model/Statement.java @@ -21,7 +21,7 @@ import com.fasterxml.jackson.annotation.JsonTypeInfo; }) public interface Statement { - String toString(Program program); + String toString(Program program, boolean aliveInfo); /** Set the index of the statement. Indexes are used during live range analysis. */ void setIndex(Integer idx); diff --git a/src/main/java/dk/camelot64/kickc/model/StatementAsm.java b/src/main/java/dk/camelot64/kickc/model/StatementAsm.java index a756578cc..d76a178c2 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementAsm.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementAsm.java @@ -14,7 +14,7 @@ public class StatementAsm extends StatementBase { } @Override - public String toString(Program program) { + public String toString(Program program, boolean aliveInfo) { return "asm { "+asmLines.getText()+" }"; } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementAssignment.java b/src/main/java/dk/camelot64/kickc/model/StatementAssignment.java index 0923b1624..aa4030b01 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementAssignment.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementAssignment.java @@ -90,18 +90,18 @@ public class StatementAssignment extends StatementBase implements StatementLValu @Override public String toString() { - return toString(null); + return toString(null, true); } @Override - public String toString(Program program) { + public String toString(Program program, boolean aliveInfo) { return super.idxString() + lValue.toString(program) + " ← " + (rValue1==null?"":rValue1.toString(program)+" ") + (operator==null?"":operator+" ") + rValue2.toString(program) + - super.aliveString(program); + (aliveInfo?super.aliveString(program):""); } @Override diff --git a/src/main/java/dk/camelot64/kickc/model/StatementBase.java b/src/main/java/dk/camelot64/kickc/model/StatementBase.java index 1acf95d37..6b4baa2eb 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementBase.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementBase.java @@ -41,7 +41,7 @@ public abstract class StatementBase implements Statement { @Override public String toString() { - return toString(null); + return toString(null, true); } public String aliveString(Program program) { diff --git a/src/main/java/dk/camelot64/kickc/model/StatementCall.java b/src/main/java/dk/camelot64/kickc/model/StatementCall.java index 0775b17f8..a03a0630f 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementCall.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementCall.java @@ -97,7 +97,7 @@ public class StatementCall extends StatementBase implements StatementLValue { } @Override - public String toString(Program program) { + public String toString(Program program, boolean aliveInfo) { StringBuilder res = new StringBuilder(); res.append(super.idxString()); if (lValue != null) { @@ -118,7 +118,9 @@ public class StatementCall extends StatementBase implements StatementLValue { if (parametersByAssignment) { res.append("param-assignment"); } - res.append(super.aliveString(program)); + if(aliveInfo) { + res.append(super.aliveString(program)); + } return res.toString(); } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementConditionalJump.java b/src/main/java/dk/camelot64/kickc/model/StatementConditionalJump.java index 0985810b6..65a85ce79 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementConditionalJump.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementConditionalJump.java @@ -82,7 +82,7 @@ public class StatementConditionalJump extends StatementBase { } @Override - public String toString(Program program) { + public String toString(Program program, boolean aliveInfo) { StringBuilder out = new StringBuilder(); out.append(super.idxString()); out.append("if("); @@ -93,7 +93,9 @@ public class StatementConditionalJump extends StatementBase { out.append(rValue2.toString(program)); out.append(") goto "); out.append(destination.getFullName()); - out.append(super.aliveString(program)); + if(aliveInfo) { + out.append(super.aliveString(program)); + } return out.toString(); } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementJump.java b/src/main/java/dk/camelot64/kickc/model/StatementJump.java index 3640957e2..5874bdb66 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementJump.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementJump.java @@ -24,8 +24,8 @@ public class StatementJump extends StatementBase { } @Override - public String toString(Program program) { - return super.idxString() + "goto " + destination.getFullName()+ super.aliveString(program); + public String toString(Program program, boolean aliveInfo) { + return super.idxString() + "goto " + destination.getFullName()+ (aliveInfo?super.aliveString(program):""); } } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementLabel.java b/src/main/java/dk/camelot64/kickc/model/StatementLabel.java index bb25b5c5d..a681430c2 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementLabel.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementLabel.java @@ -17,8 +17,8 @@ public class StatementLabel extends StatementBase { } @Override - public String toString(Program program) { - return super.idxString() + label.getFullName() + ":"+super.aliveString(program); + public String toString(Program program, boolean aliveInfo) { + return super.idxString() + label.getFullName() + ":"+(aliveInfo?super.aliveString(program):""); } } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementPhiBlock.java b/src/main/java/dk/camelot64/kickc/model/StatementPhiBlock.java index 453bc58f6..13537d04d 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementPhiBlock.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementPhiBlock.java @@ -63,14 +63,16 @@ public class StatementPhiBlock extends StatementBase { } @Override - public String toString(Program program) { + public String toString(Program program, boolean aliveInfo) { StringBuilder s = new StringBuilder(); List variables = new ArrayList<>(phiVariables); Collections.reverse(variables); if(phiVariables.size()==0) { s.append(super.idxString()); s.append("phi()"); - s.append(super.aliveString(program)); + if(aliveInfo) { + s.append(super.aliveString(program)); + } s.append("\n "); } for (PhiVariable phiVariable : variables) { @@ -85,7 +87,9 @@ public class StatementPhiBlock extends StatementBase { s.append(rValue==null?"null":rValue.toString(program)); } s.append(" )"); - s.append(super.aliveString(program)); + if(aliveInfo) { + s.append(super.aliveString(program)); + } s.append("\n "); } if(s.length()>0) { diff --git a/src/main/java/dk/camelot64/kickc/model/StatementProcedureBegin.java b/src/main/java/dk/camelot64/kickc/model/StatementProcedureBegin.java index 924551245..f6d4c5650 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementProcedureBegin.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementProcedureBegin.java @@ -30,8 +30,8 @@ public class StatementProcedureBegin extends StatementBase { } @Override - public String toString(Program program) { - return super.idxString() + "proc " + procedure.toString(program) + super.aliveString(program); + public String toString(Program program, boolean aliveInfo) { + return super.idxString() + "proc " + procedure.toString(program) + (aliveInfo?super.aliveString(program):""); } } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementProcedureEnd.java b/src/main/java/dk/camelot64/kickc/model/StatementProcedureEnd.java index 2f6b0de18..a7bcdb3af 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementProcedureEnd.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementProcedureEnd.java @@ -17,7 +17,7 @@ public class StatementProcedureEnd extends StatementBase { } @Override - public String toString(Program program) { - return super.idxString() + "endproc // " + procedure.getFullName() + "()"+super.aliveString(program); + public String toString(Program program, boolean aliveInfo) { + return super.idxString() + "endproc // " + procedure.getFullName() + "()"+(aliveInfo?super.aliveString(program):""); } } diff --git a/src/main/java/dk/camelot64/kickc/model/StatementReturn.java b/src/main/java/dk/camelot64/kickc/model/StatementReturn.java index 8dff46e26..f18c684f2 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementReturn.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementReturn.java @@ -35,8 +35,8 @@ public class StatementReturn extends StatementBase { } @Override - public String toString(Program program) { - return super.idxString() + "return " + (value == null ? "" : value.toString(program)) + super.aliveString(program); + public String toString(Program program, boolean aliveInfo) { + return super.idxString() + "return " + (value == null ? "" : value.toString(program)) + (aliveInfo?super.aliveString(program):""); } @Override diff --git a/src/main/java/dk/camelot64/kickc/model/StatementSequence.java b/src/main/java/dk/camelot64/kickc/model/StatementSequence.java index 2d873eea1..57e7f0691 100644 --- a/src/main/java/dk/camelot64/kickc/model/StatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/model/StatementSequence.java @@ -26,7 +26,7 @@ public class StatementSequence { if(!(statement instanceof StatementLabel) && !(statement instanceof StatementProcedureBegin) && !(statement instanceof StatementProcedureEnd)) { out.append(" "); } - out.append(statement.toString(program)+"\n"); + out.append(statement.toString(program, true)+"\n"); } return out.toString(); } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java index 164f5cb00..d9576d4e6 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateStatementSequence.java @@ -622,7 +622,7 @@ public class Pass1GenerateStatementSequence extends KickCBaseVisitor { for (PrePostModifier mod : modifiers) { Statement stmt = new StatementAssignment((LValue) mod.child, mod.operator, mod.child); parser.sequence.addStatement(stmt); - parser.program.getLog().append("Adding pre/post-modifier "+stmt.toString(parser.program)); + parser.program.getLog().append("Adding pre/post-modifier "+stmt.toString(parser.program, true)); } } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java b/src/main/java/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java index 933d781c0..c945ed6e4 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2ConditionalJumpSimplification.java @@ -55,7 +55,7 @@ public class Pass2ConditionalJumpSimplification extends Pass2SsaOptimization { conditionalJump.setOperator(conditionAssignment.getOperator()); conditionalJump.setrValue2(conditionAssignment.getrValue2()); simpleConditionVars.add(conditionVar); - getLog().append("Simple Condition " + conditionVar.toString(getProgram()) + " " + conditionalJump.toString(getProgram())); + getLog().append("Simple Condition " + conditionVar.toString(getProgram()) + " " + conditionalJump.toString(getProgram(), true)); break; default: } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2UnaryNotSimplification.java b/src/main/java/dk/camelot64/kickc/passes/Pass2UnaryNotSimplification.java index 2ba14437f..dcb07b526 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2UnaryNotSimplification.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2UnaryNotSimplification.java @@ -98,7 +98,7 @@ public class Pass2UnaryNotSimplification extends Pass2SsaOptimization { assignment.setrValue1(tempAssignment.getrValue1()); assignment.setOperator(newOperator==null?null:Operator.getBinary(newOperator)); assignment.setrValue2(tempAssignment.getrValue2()); - getLog().append("Inversing boolean not "+assignment.toString(getProgram()) +" from "+tempAssignment.toString(getProgram())); + getLog().append("Inversing boolean not "+assignment.toString(getProgram(), true) +" from "+tempAssignment.toString(getProgram(), true)); } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java index 32a3f90ec..e8ce5d7aa 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4CodeGeneration.java @@ -5,8 +5,6 @@ import dk.camelot64.kickc.fragment.AsmFragment; import dk.camelot64.kickc.fragment.AsmFragmentManager; import dk.camelot64.kickc.fragment.AsmFragmentSignature; import dk.camelot64.kickc.model.*; -import dk.camelot64.kickc.parser.KickCParser; -import org.antlr.v4.runtime.CharStreams; import java.util.*; @@ -17,8 +15,12 @@ public class Pass4CodeGeneration { private Program program; - public Pass4CodeGeneration(Program program) { + /** Should the generated ASM contain verbose alive info for the statements (costs a bit more to generate). */ + boolean verboseAliveInfo; + + public Pass4CodeGeneration(Program program, boolean verboseAliveInfo) { this.program = program; + this.verboseAliveInfo = verboseAliveInfo; } ControlFlowGraph getGraph() { @@ -193,7 +195,7 @@ public class Pass4CodeGeneration { */ public void generateStatementAsm(AsmProgram asm, ControlFlowBlock block, Statement statement, AsmCodegenAluState aluState, boolean genCallPhiEntry) { - asm.startSegment(statement.getIndex(), statement.toString(program)); + asm.startSegment(statement.getIndex(), statement.toString(program, verboseAliveInfo)); // IF the previous statement was added to the ALU register - generate the composite ASM fragment if (aluState.hasAluAssignment()) { diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftCombinations.java b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftCombinations.java index 18ce9fbcb..9f198286a 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftCombinations.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftCombinations.java @@ -127,7 +127,7 @@ public class Pass4RegisterUpliftCombinations extends Pass2Base { } // Generate ASM try { - new Pass4CodeGeneration(program).generate(); + new Pass4CodeGeneration(program, false).generate(); } catch (AsmFragmentManager.UnknownFragmentException e) { unknownFragments.add(e.getFragmentSignature()); if (program.getLog().isVerboseUplift()) { @@ -240,7 +240,7 @@ public class Pass4RegisterUpliftCombinations extends Pass2Base { if(overlap) { if (program.getLog().isVerboseUplift()) { StringBuilder msg = new StringBuilder(); - msg.append("Overlap register " + allocation + " in " + statement.toString(program)); + msg.append("Overlap register " + allocation + " in " + statement.toString(program, true)); program.getLog().append(msg.toString()); } return true; diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java index 6af8dc042..f68e3122c 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass4RegisterUpliftPotentialRegisterAnalysis.java @@ -69,7 +69,7 @@ public class Pass4RegisterUpliftPotentialRegisterAnalysis extends Pass2Base { continue; } else { StringBuilder msg = new StringBuilder(); - msg.append("Statement ").append(statement.toString(getProgram())); + msg.append("Statement ").append(statement.toString(getProgram(), true)); msg.append(" always clobbers "); for (Registers.Register register : alwaysClobbered) { msg.append(register).append(" "); @@ -132,10 +132,10 @@ public class Pass4RegisterUpliftPotentialRegisterAnalysis extends Pass2Base { combination.allocate(getProgram().getScope()); // Generate ASM AsmProgram asm = new AsmProgram(); - asm.startSegment(statement.getIndex(), statement.toString(getProgram())); + asm.startSegment(statement.getIndex(), statement.toString(getProgram(), true)); Pass4CodeGeneration.AsmCodegenAluState aluState = new Pass4CodeGeneration.AsmCodegenAluState(); try { - (new Pass4CodeGeneration(getProgram())).generateStatementAsm(asm, block, statement, aluState, false); + (new Pass4CodeGeneration(getProgram(), false)).generateStatementAsm(asm, block, statement, aluState, false); } catch (AsmFragmentManager.UnknownFragmentException e) { unknownFragments.add(e.getFragmentSignature()); StringBuilder msg = new StringBuilder();