private void VisitLoopAfterRightBorderNodes(Compiler.Nodes.Loop loop)
        {
            LoopData loopData = _loopData[loop];

            _builder.CreateBr(loopData.StartBlock);
            _builder.PositionBuilderAtEnd(loopData.EndBlock);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 4
0
        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);
        }
Esempio n. 6
0
        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);
        }
Esempio n. 7
0
        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);
        }