Пример #1
0
        public static void RunPass(ControlFlowGraph cfg)
        {
            // Scratch buffer used to store uses.
            Span <Operation> buffer = default;

            bool modified;

            do
            {
                modified = false;

                for (BasicBlock block = cfg.Blocks.Last; block != null; block = block.ListPrevious)
                {
                    Operation node;
                    Operation prevNode;

                    for (node = block.Operations.Last; node != default; node = prevNode)
                    {
                        prevNode = node.ListPrevious;

                        if (IsUnused(node))
                        {
                            RemoveNode(block, node);

                            modified = true;

                            continue;
                        }
                        else if (node.Instruction == Instruction.Phi)
                        {
                            continue;
                        }

                        ConstantFolding.RunPass(node);
                        Simplification.RunPass(node);

                        if (DestIsLocalVar(node))
                        {
                            if (IsPropagableCompare(node))
                            {
                                modified |= PropagateCompare(ref buffer, node);

                                if (modified && IsUnused(node))
                                {
                                    RemoveNode(block, node);
                                }
                            }
                            else if (IsPropagableCopy(node))
                            {
                                PropagateCopy(ref buffer, node);

                                RemoveNode(block, node);

                                modified = true;
                            }
                        }
                    }
                }
            }while (modified);
        }
Пример #2
0
        public static void RunPass(ControlFlowGraph cfg)
        {
            bool modified;

            do
            {
                modified = false;

                foreach (BasicBlock block in cfg.Blocks)
                {
                    LinkedListNode <Node> node = block.Operations.First;

                    while (node != null)
                    {
                        LinkedListNode <Node> nextNode = node.Next;

                        bool isUnused = IsUnused(node.Value);

                        if (!(node.Value is Operation operation) || isUnused)
                        {
                            if (isUnused)
                            {
                                RemoveNode(block, node);

                                modified = true;
                            }

                            node = nextNode;

                            continue;
                        }

                        ConstantFolding.RunPass(operation);

                        Simplification.RunPass(operation);

                        if (DestIsLocalVar(operation) && IsPropagableCopy(operation))
                        {
                            PropagateCopy(operation);

                            RemoveNode(block, node);

                            modified = true;
                        }

                        node = nextNode;
                    }
                }
            }while (modified);
        }
Пример #3
0
        public static void RunPass(ControlFlowGraph cfg)
        {
            bool modified;

            do
            {
                modified = false;

                for (BasicBlock block = cfg.Blocks.First; block != null; block = block.ListNext)
                {
                    Node node = block.Operations.First;

                    while (node != null)
                    {
                        Node nextNode = node.ListNext;

                        bool isUnused = IsUnused(node);

                        if (!(node is Operation operation) || isUnused)
                        {
                            if (isUnused)
                            {
                                RemoveNode(block, node);

                                modified = true;
                            }

                            node = nextNode;

                            continue;
                        }

                        ConstantFolding.RunPass(operation);

                        Simplification.RunPass(operation);

                        if (DestIsLocalVar(operation))
                        {
                            if (IsPropagableCompare(operation))
                            {
                                modified |= PropagateCompare(operation);

                                if (modified && IsUnused(operation))
                                {
                                    RemoveNode(block, node);
                                }
                            }
                            else if (IsPropagableCopy(operation))
                            {
                                PropagateCopy(operation);

                                RemoveNode(block, node);

                                modified = true;
                            }
                        }

                        node = nextNode;
                    }
                }
            }while (modified);
        }