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:
parent
6c4a99240d
commit
3d7914c31f
src/main/java/dk/camelot64/kickc/passes
@ -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);
|
||||
|
Loading…
x
Reference in New Issue
Block a user