public void Convert()
        {
            MethodRoot.Start = ConvertNode(MethodRoot.Start);

            var graphNodes = MethodRoot.Start.IterateGraphNodesRecursive(false).ToArray();

            foreach (var graphNode in graphNodes)
            {
                ConvertNode(graphNode);
            }

            GraphNode ConvertNode(GraphNode graphNode)
            {
                return(graphNode switch
                {
                    null => throw new ArgumentOutOfRangeException(nameof(graphNode)),
                    GraphDataFlowBlockNode _ => graphNode,
                    GraphDataFlowExpressionNode _ => graphNode,
                    GraphControlFlowBlockNode blockNode => ConvertControlFlowNode(blockNode),
                    GraphControlFlowConditionalNode conditionalNode => ConvertControlFlowNode(conditionalNode),
                    GraphControlFlowReturnNode returnNode => ConvertControlFlowNode(returnNode),
                    GraphDataFlowConditionalNode _ => graphNode,
                    GraphDataFlowReturnNode _ => graphNode,
                    _ => throw new ArgumentOutOfRangeException(nameof(graphNode))
                });
            }
        private bool SimplifyGraph(GraphMethodRoot methodNode)
        {
            var oldStart = methodNode.Start;

            var res = SimplifyNode(oldStart);

            if (res)
            {
                if (oldStart is GraphControlFlowBlockNode oldStartBlockNode)
                {
                    methodNode.Start = oldStartBlockNode.Outgoing;
                    Log.Verbose(
                        "CFG: {MethodName}: simplified away start point {Node}, new start point is {NewNode}",
                        methodNode.Name,
                        oldStart,
                        methodNode.Start
                        );
                }
                else
                {
                    Log.Error(
                        "CFG: {MethodName}: simplified away start point {Node}, but it wasn't {TypeName}",
                        methodNode.Name,
                        oldStart,
                        nameof(GraphControlFlowBlockNode)
                        );
                }
            }

            var graphNodes = methodNode.Start.IterateGraphNodesRecursive(false).ToArray();

            foreach (var graphNode in graphNodes)
            {
                res = SimplifyNode(graphNode) || res;
            }

            return(res);

            bool SimplifyNode(GraphNode graphNode)
            {
                return(graphNode switch
                {
                    null => throw new ArgumentOutOfRangeException(nameof(graphNode)),
                    GraphControlFlowBlockNode blockNode => SimplifyGraph(blockNode),
                    GraphControlFlowConditionalNode _ => false,
                    GraphControlFlowReturnNode _ => false,
                    _ => throw new ArgumentOutOfRangeException(nameof(graphNode))
                });
            }