private void VisitLoopAfterRightBorderNodes(Compiler.Nodes.Loop loop) { LoopData loopData = _loopData[loop]; _builder.CreateBr(loopData.StartBlock); _builder.PositionBuilderAtEnd(loopData.EndBlock); }
private void VisitLoopAfterRightBorderNodes(Compiler.Nodes.Loop loop) { LoopData loopData = _loopData[loop]; _builder.EmitBranch(loopData.Start); _builder.SetLabel(loopData.End); }
private void VisitLoopBeforeLeftBorderNodes(Compiler.Nodes.Loop loop) { LLVMBasicBlockRef startBlock = _topLevelFunction.AppendBasicBlock($"loop{loop.UniqueId}_start"), interiorBlock = _topLevelFunction.AppendBasicBlock($"loop{loop.UniqueId}_interior"), endBlock = _topLevelFunction.AppendBasicBlock($"loop{loop.UniqueId}_end"); LoopConditionTunnel loopCondition = loop.BorderNodes.OfType <LoopConditionTunnel>().First(); Terminal loopConditionInput = loopCondition.InputTerminals[0]; var conditionAllocationSource = (LocalAllocationValueSource)GetTerminalValueSource(loopConditionInput); _loopData[loop] = new LoopData(conditionAllocationSource, startBlock, interiorBlock, endBlock); if (!loopConditionInput.IsConnected) { // if loop condition was unwired, initialize it to true conditionAllocationSource.UpdateValue(_builder, true.AsLLVMValue()); } // initialize all output tunnels with None values, in case the loop interior does not execute foreach (Tunnel outputTunnel in loop.BorderNodes.OfType <Tunnel>().Where(tunnel => tunnel.Direction == Direction.Output)) { VariableReference tunnelOutputVariable = outputTunnel.OutputTerminals[0].GetTrueVariable(); ValueSource tunnelOutputSource = _variableValues[tunnelOutputVariable]; LLVMTypeRef tunnelOutputType = tunnelOutputVariable.Type.AsLLVMType(); tunnelOutputSource.UpdateValue(_builder, LLVMSharp.LLVM.ConstNull(tunnelOutputType)); } _builder.CreateBr(startBlock); _builder.PositionBuilderAtEnd(startBlock); }
private void VisitLoopAfterLeftBorderNodes(Compiler.Nodes.Loop loop) { LoopData loopData = _loopData[loop]; LoadLocalAllocationReference(loopData.LoopCondition); _builder.EmitDerefInteger(); _builder.EmitBranchIfFalse(loopData.End); }
private void VisitLoopAfterLeftBorderNodes(Compiler.Nodes.Loop loop) { LoopData loopData = _loopData[loop]; LLVMValueRef condition = loopData.ConditionAllocationSource.GetValue(_builder); _builder.CreateCondBr(condition, loopData.InteriorBlock, loopData.EndBlock); _builder.PositionBuilderAtEnd(loopData.InteriorBlock); }
private void VisitLoopBeforeLeftBorderNodes(Compiler.Nodes.Loop loop) { LabelBuilder start = _builder.CreateLabel(), end = _builder.CreateLabel(); LoopConditionTunnel loopCondition = loop.BorderNodes.OfType <LoopConditionTunnel>().First(); Terminal loopConditionInput = loopCondition.InputTerminals.ElementAt(0); VariableReference loopConditionVariable = loopConditionInput.GetTrueVariable(); _loopData[loop] = new LoopData(start, end, loopConditionVariable); if (!loopConditionInput.IsConnected) { // if loop condition was unwired, initialize it to true LoadLocalAllocationReference(loopConditionVariable); _builder.EmitLoadIntegerImmediate(1); _builder.EmitStoreInteger(); } _builder.SetLabel(start); }
public bool VisitLoop(Compiler.Nodes.Loop loop, StructureTraversalPoint traversalPoint) { // generate code for each left-side border node; // each border node that can affect condition should &&= the LoopCondition // variable with whether it allows loop to proceed switch (traversalPoint) { case StructureTraversalPoint.BeforeLeftBorderNodes: VisitLoopBeforeLeftBorderNodes(loop); break; case StructureTraversalPoint.AfterLeftBorderNodesAndBeforeDiagram: VisitLoopAfterLeftBorderNodes(loop); break; case StructureTraversalPoint.AfterRightBorderNodes: VisitLoopAfterRightBorderNodes(loop); break; } return(true); }