/// <summary> /// Creates a new loop info instance from the given SCC while checking for /// unique entry and exit blocks. /// </summary> /// <param name="scc">The SCC.</param> /// <returns>The resolved loop info instance.</returns> public static LoopInfo <TOrder, TDirection> Create( SCCs <TOrder, TDirection> .SCC scc) { if (!TryCreate(scc, out var loopInfo)) { throw new InvalidKernelOperationException(); } return(loopInfo); }
/// <summary> /// Constructs a new SCC. /// </summary> /// <param name="parent">The parent SCC.</param> /// <param name="index">The SCC index.</param> /// <param name="sccMembers">All SCC members.</param> internal SCC( SCCs <TOrder, TDirection> parent, int index, List <BasicBlock> sccMembers) { Debug.Assert(index >= 0, "Invalid SCC index"); Debug.Assert(sccMembers != null, "Invalid SCC members"); Parent = parent; Index = index; nodes = sccMembers; }
/// <summary> /// Constructs a new SCC. /// </summary> /// <param name="parent">The parent SCC.</param> /// <param name="index">The SCC index.</param> /// <param name="sccMembers">All SCC members.</param> internal SCC( SCCs parent, int index, List <CFG.Node> sccMembers) { Debug.Assert(parent != null, "Invalid parent"); Debug.Assert(index >= 0, "Invalid SCC index"); Debug.Assert(sccMembers != null, "Invalid SCC members"); Parent = parent; Index = index; nodes = sccMembers; }