X-Git-Url: https://gerrit.simantics.org/r/gitweb?a=blobdiff_plain;f=bundles%2Forg.simantics.scl.compiler%2Fsrc%2Forg%2Fsimantics%2Fscl%2Fcompiler%2Finternal%2Fcodegen%2Fssa%2Fexits%2FIf.java;h=296ec6d1f461545c72222ff8ad49cde1310ef267;hb=refs%2Fchanges%2F21%2F221%2F6;hp=0f4673aada2d4a30738710c55d7b293e7e861d62;hpb=12d9af17384d960b75d58c3935d2b7b46d93e87b;p=simantics%2Fplatform.git 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); + } }