]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/statements/LetApply.java
Merge "Ensure GetElementClassRequest is not constructed without elementFactory"
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / statements / LetApply.java
index 8d5d24e3c421ea37a77406153286fafc1f8cdbfb..d3f22196b4058abe550f7060df723bbce4ff5f19 100644 (file)
@@ -5,6 +5,7 @@ import java.util.Arrays;
 \r
 import org.simantics.scl.compiler.common.exceptions.InternalCompilerError;\r
 import org.simantics.scl.compiler.constants.Constant;\r
+import org.simantics.scl.compiler.constants.SCLConstant;\r
 import org.simantics.scl.compiler.internal.codegen.continuations.ContRef;\r
 import org.simantics.scl.compiler.internal.codegen.references.BoundVar;\r
 import org.simantics.scl.compiler.internal.codegen.references.Val;\r
@@ -22,13 +23,13 @@ import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder;
 import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext;\r
 import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext;\r
 import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext;\r
+import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor;\r
 import org.simantics.scl.compiler.top.SCLCompilerConfiguration;\r
 import org.simantics.scl.compiler.types.TVar;\r
 import org.simantics.scl.compiler.types.Type;\r
 import org.simantics.scl.compiler.types.Types;\r
 import org.simantics.scl.compiler.types.exceptions.MatchException;\r
 import org.simantics.scl.compiler.types.util.MultiFunction;\r
-import org.simantics.scl.compiler.types.util.TypeUnparsingContext;\r
 \r
 public class LetApply extends LetStatement implements ValRefBinder {\r
     private ValRef function;\r
@@ -158,6 +159,26 @@ public class LetApply extends LetStatement implements ValRefBinder {
             context.markModified("LetApply.dead-let-statement");\r
             return;\r
         }\r
+        // TODO this is quite heavy way for inlining constants\r
+        for(int i=0;i<parameters.length;++i) {\r
+            ValRef parameter = parameters[i];\r
+            Val value = parameter.getBinding();\r
+            if(!(value instanceof SCLConstant))\r
+                continue;\r
+            SCLConstant constant = (SCLConstant)value;\r
+            if(constant.inlineArity != 0)\r
+                continue;\r
+            SSAFunction definition = constant.definition;\r
+            SSABlock block = definition.getFirstBlock();\r
+            if(block.getFirstStatement() != null || !(block.getExit() instanceof Jump))\r
+                continue;\r
+            Jump jump = (Jump)block.getExit();\r
+            if(jump.getTarget().getBinding() != definition.getReturnCont())\r
+                continue;\r
+            if(jump.getParameter(0).getTypeParameters().length > 0)\r
+                continue;\r
+            parameter.replaceBy(jump.getParameter(0).getBinding());\r
+        }\r
         Val functionVal = getFunction().getBinding();\r
         if(functionVal instanceof BoundVar) {\r
             BoundVarBinder parent_ = ((BoundVar)functionVal).parent;\r
@@ -460,4 +481,11 @@ public class LetApply extends LetStatement implements ValRefBinder {
     public void prepare(MethodBuilder mb) {\r
         function.getBinding().prepare(mb);\r
     }\r
+\r
+    @Override\r
+    public void forValRefs(ValRefVisitor visitor) {\r
+        visitor.visit(function);\r
+        for(ValRef parameter : parameters)\r
+            visitor.visit(parameter);\r
+    }\r
 }\r