diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index 23310454f..cb8d88400 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -222,7 +222,7 @@ public class Compiler { assertions.add(new Pass2AssertNoLabels(program)); assertions.add(new Pass2AssertSingleAssignment(program)); assertions.add(new Pass2AssertRValues(program)); - //assertions.add(new Pass2AssertPhiPredecessors(program)); + assertions.add(new Pass2AssertPhiPredecessors(program)); for(Pass2SsaAssertion assertion : assertions) { assertion.check(); } diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java index 2d6db335d..db834cb48 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass1GenerateSingleStaticAssignmentForm.java @@ -197,7 +197,7 @@ public class Pass1GenerateSingleStaticAssignmentForm extends Pass1Base { VariableRef phiLValVarRef = phiVariable.getVariable(); VariableVersion versioned = (VariableVersion) getScope().getVariable(phiLValVarRef); VariableUnversioned unversioned = versioned.getVersionOf(); - List predecessors = getPredecessors(block); + List predecessors = getPhiPredecessors(block, getProgram()); for(ControlFlowBlock predecessor : predecessors) { LabelRef predecessorLabel = predecessor.getLabel(); Map predecessorMap = symbolMap.get(predecessorLabel); @@ -245,15 +245,15 @@ public class Pass1GenerateSingleStaticAssignmentForm extends Pass1Base { * @param block The block to examine * @return All predecessor blocks */ - private List getPredecessors(ControlFlowBlock block) { - List predecessors = getGraph().getPredecessors(block); - Symbol symbol = getScope().getSymbol(block.getLabel()); + public static List getPhiPredecessors(ControlFlowBlock block, Program program) { + List predecessors = program.getGraph().getPredecessors(block); + Symbol symbol = program.getScope().getSymbol(block.getLabel()); if(symbol instanceof Procedure) { Procedure procedure = (Procedure) symbol; - if(procedure.getInterruptType()!=null || Pass2ConstantIdentification.isAddressOfUsed(procedure.getRef(), getProgram())) { + if(procedure.getInterruptType()!=null || Pass2ConstantIdentification.isAddressOfUsed(procedure.getRef(), program)) { // Find all root-level predecessors to the main block - ControlFlowBlock mainBlock = getGraph().getBlock(new LabelRef(SymbolRef.MAIN_PROC_NAME)); - List mainPredecessors = getGraph().getPredecessors(mainBlock); + ControlFlowBlock mainBlock = program.getGraph().getBlock(new LabelRef(SymbolRef.MAIN_PROC_NAME)); + List mainPredecessors = program.getGraph().getPredecessors(mainBlock); for(ControlFlowBlock mainPredecessor : mainPredecessors) { if(mainPredecessor.getScope().equals(ScopeRef.ROOT)) { predecessors.add(mainPredecessor); diff --git a/src/main/java/dk/camelot64/kickc/passes/Pass2AssertPhiPredecessors.java b/src/main/java/dk/camelot64/kickc/passes/Pass2AssertPhiPredecessors.java index 781346e6b..e1065d84b 100644 --- a/src/main/java/dk/camelot64/kickc/passes/Pass2AssertPhiPredecessors.java +++ b/src/main/java/dk/camelot64/kickc/passes/Pass2AssertPhiPredecessors.java @@ -21,8 +21,9 @@ public class Pass2AssertPhiPredecessors extends Pass2SsaAssertion { for(ControlFlowBlock block : getGraph().getAllBlocks()) { if(block.hasPhiBlock()) { StatementPhiBlock phiBlock = block.getPhiBlock(); + List phiPredecessors = Pass1GenerateSingleStaticAssignmentForm.getPhiPredecessors(block, getProgram()); List predecessors = - getGraph().getPredecessors(block).stream().map(ControlFlowBlock::getLabel).collect(Collectors.toList()); + phiPredecessors.stream().map(ControlFlowBlock::getLabel).collect(Collectors.toList()); for(StatementPhiBlock.PhiVariable phiVariable : phiBlock.getPhiVariables()) { for(StatementPhiBlock.PhiRValue phiRValue : phiVariable.getValues()) { if(!predecessors.contains(phiRValue.getPredecessor())) {