]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scl.compiler/src/org/simantics/scl/compiler/internal/codegen/ssa/exits/If.java
Merged changes from feature/scl to master.
[simantics/platform.git] / bundles / org.simantics.scl.compiler / src / org / simantics / scl / compiler / internal / codegen / ssa / exits / If.java
index 0f4673aada2d4a30738710c55d7b293e7e861d62..296ec6d1f461545c72222ff8ad49cde1310ef267 100644 (file)
@@ -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);
+    }
 }