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=ee69106cdb5f8dccace0220fcee6ebbf9adf0883;hb=refs%2Fchanges%2F34%2F1534%2F3;hp=0f4673aada2d4a30738710c55d7b293e7e861d62;hpb=969bd23cab98a79ca9101af33334000879fb60c5;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..ee69106cd 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; @@ -27,7 +31,8 @@ public class If extends SSAExit implements ValRefBinder { private ContRef thenTarget; private ContRef elseTarget; - public If(ValRef condition, ContRef thenTarget, ContRef elseTarget) { + public If(int lineNumber, ValRef condition, ContRef thenTarget, ContRef elseTarget) { + super(lineNumber); setCondition(condition); setThenTarget(thenTarget); setElseTarget(elseTarget); @@ -50,6 +55,21 @@ public class If extends SSAExit implements ValRefBinder { @Override public void generateCode(MethodBuilder mb) { + mb.lineNumber(lineNumber); + 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, "=="); @@ -129,9 +149,11 @@ public class If extends SSAExit implements ValRefBinder { @Override public SSAExit copy(CopyContext context) { - return new If(context.copy(condition), + If copy = new If(lineNumber, + context.copy(condition), context.copy(thenTarget), context.copy(elseTarget)); + return copy; } @Override @@ -145,11 +167,11 @@ public class If extends SSAExit implements ValRefBinder { if(cond instanceof BooleanConstant) { SSAExit newExit; if(((BooleanConstant) cond).getValue()) { - newExit = new Jump(thenTarget); + newExit = new Jump(lineNumber, thenTarget); elseTarget.remove(); } else { - newExit = new Jump(elseTarget); + newExit = new Jump(lineNumber, elseTarget); thenTarget.remove(); } condition.remove(); @@ -159,7 +181,7 @@ public class If extends SSAExit implements ValRefBinder { else if(thenTarget.getBinding() == elseTarget.getBinding()) { elseTarget.remove(); condition.remove(); - getParent().setExit(new Jump(thenTarget)); + getParent().setExit(new Jump(lineNumber, thenTarget)); context.markModified("equal-branches-if"); } } @@ -200,4 +222,14 @@ public class If extends SSAExit implements ValRefBinder { return SSABlock.EMPTY_ARRAY; } } + + @Override + public void forValRefs(ValRefVisitor visitor) { + visitor.visit(condition); + } + + @Override + public void cleanup() { + condition.remove(); + } }