private ForStatementUpNode Visit(ForStatementUpNode node) { Visit(node.expr1); builder.BuildStore(GetProperty(node.expr1).addr, LookupSymbolOrAlloc(node.Identifier)); var condBB = func.AppendBasicBlock($"cond_{++count}"); var bodyBB = func.AppendBasicBlock($"body_{++count}"); var contBB = func.AppendBasicBlock($"cont_{++count}"); builder.BuildBr(condBB); builder.PositionAtEnd(condBB); Visit(node.expr2); var t = builder.BuildLoad(LookupSymbolOrAlloc(node.Identifier)); var b = builder.BuildICmp(LLVMIntPredicate.LLVMIntSLT, t, GetProperty(node.expr2).addr); builder.BuildCondBr(b, bodyBB, contBB); builder.PositionAtEnd(bodyBB); Visit(node.StatementNode); t = builder.BuildLoad(LookupSymbolOrAlloc(node.Identifier)); var r = builder.BuildAdd(t, LLVMValueRef.CreateConstInt(LLVMTypeRef.Int32, 1)); builder.BuildStore(r, LookupSymbolOrAlloc(node.Identifier)); builder.BuildBr(condBB); builder.PositionAtEnd(contBB); return(node); }