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); }
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); }
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); }