| File: CodeGen\Optimizer\StackScheduler.LocalDefUseSpan.vb | Web Access |
| Project: src\roslyn\src\Compilers\VisualBasic\Portable\Microsoft.CodeAnalysis.VisualBasic.vbproj (Microsoft.CodeAnalysis.VisualBasic) |
' Licensed to the .NET Foundation under one or more agreements. ' The .NET Foundation licenses this file to you under the MIT license. ' See the LICENSE file in the project root for more information. Imports Microsoft.CodeAnalysis.Text Imports Microsoft.CodeAnalysis.VisualBasic.Symbols Imports Microsoft.CodeAnalysis.VisualBasic.Syntax Namespace Microsoft.CodeAnalysis.VisualBasic.CodeGen Partial Friend Class StackScheduler ''' <summary> ''' Represents a span of a value between definition and use. Start/end positions are ''' specified in terms of global node count as visited by StackOptimizer visitors. ''' (i.e. recursive walk not looking into constants) ''' </summary> Private Class LocalDefUseSpan Public ReadOnly Start As Integer Private _end As Integer Public ReadOnly Property [End] As Integer Get Return _end End Get End Property Public Sub New(assigned As Integer) Me.Start = assigned Me._end = assigned End Sub Public Sub SetEnd(newEnd As Integer) Debug.Assert(Me._end <= newEnd) Me._end = newEnd End Sub Public Overrides Function ToString() As String Return "[" & Me.Start.ToString(Globalization.CultureInfo.InvariantCulture) & ", " & Me.End.ToString(Globalization.CultureInfo.InvariantCulture) & ")" End Function ''' <summary> ''' when current And other use spans are regular spans we can have only 2 conflict cases: ''' [1, 3) conflicts with [0, 2) ''' [1, 3) conflicts with [2, 4) ''' ''' NOTE: With regular spans, it is not possible for two spans to share an edge point ''' unless they belong to the same local. (because we cannot access two real locals at the same time) ''' ''' specifically: ''' [1, 3) does Not conflict with [0, 1) since such spans would need to belong to the same local ''' </summary> Public Function ConflictsWith(other As LocalDefUseSpan) As Boolean Return Contains(other.Start) Xor Contains(other.End) End Function Private Function Contains(val As Integer) As Boolean Return Me.Start < val AndAlso Me.End > val End Function ''' <summary> ''' Dummy locals represent implicit control flow ''' it is not allowed for a regular local span to cross into or ''' be immediately adjacent to a dummy span. ''' ''' specifically: ''' [1, 3) does conflict with [0, 1) since that would imply a value flowing into or out of a span surrounded by a branch/label ''' ''' </summary> Public Function ConflictsWithDummy(dummy As LocalDefUseSpan) As Boolean Return Includes(dummy.Start) Xor Includes(dummy.End) End Function Private Function Includes(val As Integer) As Boolean Return Me.Start <= val AndAlso Me.End >= val End Function End Class End Class End Namespace