public function process(GraphState $state) { $graph = $state->getGraph(); $vars = Helper::findVariables($graph); $postdominator = $state->getPostDominator(); $dominator = $state->getDominator(); foreach ($vars as $var) { $usages = []; foreach ($graph->vertices() as $vertex) { if (in_array($var, $vertex->getVariables(), true)) { $usages[] = $vertex; } } $dom = $postdominator->immediateDominatorArray($usages); while ($dom) { foreach ($usages as $usage) { if ($dominator->strictlyDominates($usage, $dom)) { $dom = $postdominator->immediateDominator($dom); continue 2; } } break; } if (!$dom) { continue; } if ($dom instanceof Jump || $dom instanceof JumpZ) { Helper::insertBefore($dom, new Free($var), $graph); } else { Helper::insertAfter($dom, new Free($var), $graph); } } }