From 2427720581d531ae353e9ab5bc5fc60437028968 Mon Sep 17 00:00:00 2001 From: jespergravgaard Date: Mon, 2 Mar 2020 20:56:04 +0100 Subject: [PATCH] Fixed problem where unused parameters were eliminated. --- .../java/dk/camelot64/kickc/Compiler.java | 4 ++-- .../kickc/model/symbols/Procedure.java | 19 ++++++++++--------- .../passes/PassNEliminateUnusedVars.java | 4 ++++ 3 files changed, 16 insertions(+), 11 deletions(-) diff --git a/src/main/java/dk/camelot64/kickc/Compiler.java b/src/main/java/dk/camelot64/kickc/Compiler.java index ae5f3de5c..53a238c97 100644 --- a/src/main/java/dk/camelot64/kickc/Compiler.java +++ b/src/main/java/dk/camelot64/kickc/Compiler.java @@ -146,8 +146,8 @@ public class Compiler { if(variableBuilderConfig == null) { VariableBuilderConfig config = new VariableBuilderConfig(); - VariableBuilderConfig.defaultPreConfig(config, program.getLog()); - VariableBuilderConfig.defaultPostConfig(config, program.getLog()); + VariableBuilderConfig.defaultPreConfig(config, getLog()); + VariableBuilderConfig.defaultPostConfig(config, getLog()); this.variableBuilderConfig = config; } diff --git a/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java b/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java index df51de327..7093bdc55 100644 --- a/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java +++ b/src/main/java/dk/camelot64/kickc/model/symbols/Procedure.java @@ -8,6 +8,7 @@ import dk.camelot64.kickc.model.values.ProcedureRef; import java.util.ArrayList; import java.util.List; +import java.util.Objects; /** Symbol describing a procedure/function */ public class Procedure extends Scope { @@ -233,19 +234,19 @@ public class Procedure extends Scope { if(this == o) return true; if(o == null || getClass() != o.getClass()) return false; if(!super.equals(o)) return false; - Procedure procedure = (Procedure) o; - - if(returnType != null ? !returnType.equals(procedure.returnType) : procedure.returnType != null) return false; - return parameterNames != null ? parameterNames.equals(procedure.parameterNames) : procedure.parameterNames == null; + return declaredInline == procedure.declaredInline && + Objects.equals(returnType, procedure.returnType) && + Objects.equals(parameterNames, procedure.parameterNames) && + interruptType == procedure.interruptType && + Objects.equals(comments, procedure.comments) && + Objects.equals(reservedZps, procedure.reservedZps) && + Objects.equals(codeSegment, procedure.codeSegment) && + callingConvention == procedure.callingConvention; } @Override public int hashCode() { - int result = super.hashCode(); - result = 31 * result + (returnType != null ? returnType.hashCode() : 0); - result = 31 * result + (parameterNames != null ? parameterNames.hashCode() : 0); - return result; + return Objects.hash(super.hashCode(), returnType, parameterNames, declaredInline, interruptType, comments, reservedZps, codeSegment, callingConvention); } - } diff --git a/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java b/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java index 2d244e6e5..576ff30ed 100644 --- a/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java +++ b/src/main/java/dk/camelot64/kickc/passes/PassNEliminateUnusedVars.java @@ -161,6 +161,10 @@ public class PassNEliminateUnusedVars extends Pass2SsaOptimization { // Do not eliminate return variables in pass 1 return false; } + if(variable.getScope() instanceof Procedure && ((Procedure) variable.getScope()).getParameters().contains(variable)) { + // Do not eliminate parameters + return false; + } final boolean unused = referenceInfos.isUnused(variable.getRef()); if(!unused) // Do not eliminate is not unused