1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-04-08 14:37:40 +00:00

Eliminated old getAssignment() methods.

This commit is contained in:
jespergravgaard 2020-02-12 22:09:43 +01:00
parent 6c4a99240d
commit 3d7914c31f
3 changed files with 23 additions and 10 deletions

@ -245,9 +245,11 @@ public class Pass2AliasElimination extends Pass2SsaOptimization {
for(AliasSet aliasSet : aliases.getAliasSets()) {
// Find the best statement source among the aliases
StatementSource bestSource = null;
List<StatementLValue> assignments = new ArrayList<>();
List<Statement> assignments = new ArrayList<>();
for(VariableRef aliasVar : aliasSet.getVars()) {
StatementLValue assignment = getGraph().getAssignment(aliasVar);
Statement assignment = getGraph().getAssignment(aliasVar);
if(assignment != null) {
assignments.add(assignment);
StatementSource source = assignment.getSource();
@ -267,7 +269,7 @@ public class Pass2AliasElimination extends Pass2SsaOptimization {
}
if(bestSource != null) {
// Found a best source - update all statements
for(StatementLValue assignment : assignments) {
for(Statement assignment : assignments) {
assignment.setSource(bestSource);
}
}

@ -1,9 +1,6 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.ConstantNotLiteral;
import dk.camelot64.kickc.model.ControlFlowBlock;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.VariableReferenceInfos;
import dk.camelot64.kickc.model.*;
import dk.camelot64.kickc.model.iterator.ProgramValue;
import dk.camelot64.kickc.model.iterator.ProgramValueIterator;
import dk.camelot64.kickc.model.operators.Operator;
@ -15,6 +12,7 @@ import dk.camelot64.kickc.model.symbols.Variable;
import dk.camelot64.kickc.model.values.*;
import java.util.Collection;
import java.util.List;
/**
* Compiler Pass eliminating several additions of constants by consolidating them to a single (compile time) constant c1+v+c2 => (c1+c2)+v
@ -188,13 +186,18 @@ public class Pass2ConstantAdditionElimination extends Pass2SsaOptimization {
*/
private ConstantValue consolidateSubConstants(VariableRef variable) {
if(getUsages(variable) > 1) {
//getLog().append("Multiple usages for variable. Not optimizing sub-constant " + variable.toString(getProgram()));
return null;
}
final Variable var = getScope().getVar(variable);
if(var.isKindLoadStore())
return null;
StatementLValue statementLValue = getGraph().getAssignment(variable);
final List<ControlFlowGraph.VarAssignment> varAssignments = ControlFlowGraph.getVarAssignments(variable, getGraph(), getScope());
if(varAssignments.size()!=1)
return null;
final ControlFlowGraph.VarAssignment varAssignment = varAssignments.get(0);
if(!ControlFlowGraph.VarAssignment.Type.STATEMENT_LVALUE.equals(varAssignment.type))
return null;
StatementLValue statementLValue = varAssignment.statementLValue;
if(statementLValue instanceof StatementAssignment) {
StatementAssignment assignment = (StatementAssignment) statementLValue;
if(assignment.getOperator() != null && "+".equals(assignment.getOperator().getOperator())) {

@ -1,6 +1,7 @@
package dk.camelot64.kickc.passes;
import dk.camelot64.kickc.model.CompileError;
import dk.camelot64.kickc.model.ControlFlowGraph;
import dk.camelot64.kickc.model.Program;
import dk.camelot64.kickc.model.iterator.ProgramValueIterator;
import dk.camelot64.kickc.model.operators.OperatorCastPtr;
@ -14,6 +15,7 @@ import dk.camelot64.kickc.model.types.SymbolTypePointer;
import dk.camelot64.kickc.model.values.*;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.atomic.AtomicBoolean;
/** Identify derefs of pointers that are defined as pointer + value - and inline them as derefidx instead */
@ -52,7 +54,13 @@ public class Pass2InlineDerefIdx extends Pass2SsaOptimization {
final Variable var = getScope().getVar(derefVar);
if(var.isKindLoadStore())
return null;
StatementLValue derefVarDefined = getGraph().getAssignment(derefVar);
final List<ControlFlowGraph.VarAssignment> varAssignments = ControlFlowGraph.getVarAssignments(derefVar, getGraph(), getScope());
if(varAssignments.size()!=1)
return null;
final ControlFlowGraph.VarAssignment varAssignment = varAssignments.get(0);
if(!ControlFlowGraph.VarAssignment.Type.STATEMENT_LVALUE.equals(varAssignment.type))
return null;
StatementLValue derefVarDefined = varAssignment.statementLValue;
if(derefVarDefined instanceof StatementAssignment) {
StatementAssignment derefAssignment = (StatementAssignment) derefVarDefined;
return attemptInlineDeref(derefAssignment);