X-Git-Url: https://gerrit.simantics.org/r/gitweb?p=simantics%2Fplatform.git;a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fssa%2Fexits%2FIf.java;h=296ec6d1f461545c72222ff8ad49cde1310ef267;hp=0f4673aada2d4a30738710c55d7b293e7e861d62;hb=a8758de5bc19e5adb3f618d3038743a164f09912;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b diff --git a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/If.java b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/If.java index 0f4673aad..296ec6d1f 100644 --- a/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/If.java +++ b/bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/If.java @@ -5,19 +5,23 @@ import java.util.ArrayList; import org.objectweb.asm.Label; import org.simantics.scl.compiler.common.exceptions.InternalCompilerError; import org.simantics.scl.compiler.constants.BooleanConstant; +import org.simantics.scl.compiler.constants.ComparisonFunction; import org.simantics.scl.compiler.internal.codegen.continuations.Cont; import org.simantics.scl.compiler.internal.codegen.continuations.ContRef; +import org.simantics.scl.compiler.internal.codegen.references.BoundVar; import org.simantics.scl.compiler.internal.codegen.references.Val; import org.simantics.scl.compiler.internal.codegen.references.ValRef; import org.simantics.scl.compiler.internal.codegen.ssa.SSABlock; import org.simantics.scl.compiler.internal.codegen.ssa.SSAExit; import org.simantics.scl.compiler.internal.codegen.ssa.SSAFunction; import org.simantics.scl.compiler.internal.codegen.ssa.binders.ValRefBinder; +import org.simantics.scl.compiler.internal.codegen.ssa.statements.LetApply; import org.simantics.scl.compiler.internal.codegen.utils.CopyContext; import org.simantics.scl.compiler.internal.codegen.utils.MethodBuilder; import org.simantics.scl.compiler.internal.codegen.utils.PrintingContext; import org.simantics.scl.compiler.internal.codegen.utils.SSASimplificationContext; import org.simantics.scl.compiler.internal.codegen.utils.SSAValidationContext; +import org.simantics.scl.compiler.internal.codegen.utils.ValRefVisitor; import org.simantics.scl.compiler.types.TVar; import org.simantics.scl.compiler.types.Type; import org.simantics.scl.compiler.types.Types; @@ -50,6 +54,20 @@ public class If extends SSAExit implements ValRefBinder { @Override public void generateCode(MethodBuilder mb) { + Val binding = condition.getBinding(); + simplifyTestCode: if(binding instanceof BoundVar) { + BoundVar boundVar = (BoundVar)binding; + if(!boundVar.generateOnFly) + break simplifyTestCode; + LetApply apply = (LetApply)boundVar.getParent(); + Val function = apply.getFunction().getBinding(); + if(!(function instanceof ComparisonFunction)) + break simplifyTestCode; + + Val[] ps = ValRef.getBindings(apply.getParameters()); + ((ComparisonFunction)function).generateCondition(mb, ps, thenTarget.getBinding(), elseTarget.getBinding()); + return; + } mb.push(condition.getBinding(), Types.BOOLEAN); Label elseLabel = mb.getLabel(elseTarget.getBinding()); mb.ifZeroComparisonBranch(elseLabel, "=="); @@ -200,4 +218,9 @@ public class If extends SSAExit implements ValRefBinder { return SSABlock.EMPTY_ARRAY; } } + + @Override + public void forValRefs(ValRefVisitor visitor) { + visitor.visit(condition); + } }