\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
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
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
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