1 package org.simantics.scl.compiler.internal.codegen.ssa;
\r
3 import java.util.ArrayList;
\r
5 import org.simantics.scl.compiler.internal.codegen.references.BoundVar;
\r
6 import org.simantics.scl.compiler.internal.codegen.references.Val;
\r
7 import org.simantics.scl.compiler.internal.codegen.references.ValRef;
\r
8 import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply;
\r
9 import org.simantics.scl.compiler.internal.codegen.utils.CopyContext;
\r
10 import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
\r
11 import org.simantics.scl.compiler.internal.codegen.utils.Printable;
\r
12 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;
\r
13 import org.simantics.scl.compiler.internal.codegen.utils.SSALambdaLiftingContext;
\r
14 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;
\r
15 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;
\r
16 import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;
\r
17 import org.simantics.scl.compiler.types.TVar;
\r
18 import org.simantics.scl.compiler.types.Type;
\r
19 import org.simantics.scl.compiler.types.Types;
\r
22 public abstract class SSAStatement implements Printable {
\r
26 public long location;
\r
28 public void detach() {
\r
30 parent.firstStatement = next;
\r
34 parent.lastStatement = prev;
\r
39 public abstract void generateCode(MethodBuilder mb);
\r
41 public abstract void validate(SSAValidationContext context);
\r
43 public void simplify(SSASimplificationContext context) {
\r
46 public abstract void destroy();
\r
48 public SSABlock getParent() {
\r
52 public SSAStatement getPrev() {
\r
56 public void setAsLastStatement() {
\r
58 parent.lastStatement = this;
\r
61 public SSAStatement getNext() {
\r
65 public void remove() {
\r
71 public String toString() {
\r
72 PrintingContext context = new PrintingContext();
\r
74 return context.toString();
\r
77 public void markGenerateOnFly() {
\r
80 public abstract SSAStatement copy(CopyContext context);
\r
81 public abstract void replace(TVar[] vars, Type[] replacements);
\r
83 public abstract void addBoundVariablesTo(SSAValidationContext context);
\r
85 public abstract void collectFreeVariables(SSAFunction function, ArrayList<ValRef> vars);
\r
87 public SSAFunction getParentFunction() {
\r
88 return parent.parent;
\r
91 public void lambdaLift(SSALambdaLiftingContext context) {
\r
94 public void insertBefore(SSAStatement statement) {
\r
96 prev = statement.prev;
\r
97 parent = statement.parent;
\r
99 parent.firstStatement = this;
\r
102 statement.prev = this;
\r
105 public void insertAfter(SSAStatement statement) {
\r
107 next = statement.next;
\r
108 parent = statement.parent;
\r
110 parent.lastStatement = this;
\r
113 statement.next = this;
\r
116 public void replaceByApply(ValRef valRef, Val function, Type[] typeParameters, Val[] parameters) {
\r
117 BoundVar target = new BoundVar(valRef.getBinding().getType());
\r
118 new LetApply(target, Types.NO_EFFECTS, function.createOccurrence(typeParameters), ValRef.createOccurrences(parameters)).insertBefore(this);
\r
119 valRef.replaceBy(target);
\r
122 public void prepare(MethodBuilder mb) {
\r
125 public abstract void forValRefs(ValRefVisitor visitor);
\r