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); } } }
public function process(GraphState $state) { $graph = $state->getGraph(); $assignments = array_merge(Helper::findVerticesByClass(JitAssignment::class, $graph), [$state->getFunction()]); $vars = Helper::findVariables($graph); $dominator = $state->getDominator(); foreach ($vars as $var) { $hash = spl_object_hash($var); $varAssignments = $this->findAssignmentsByVar($var, $assignments); $phi = $this->findPhiNodes($var, $varAssignments, $dominator, $graph); $this->implementSSA($var, $var, $state->getFunction(), $graph, $phi, $state->getFunction()->getArguments()); $this->stack->removeAll($this->stack); } }
/** * @covers ::findVariables */ public function testGetVariables() { $vars = []; for ($i = 0; $i <= 5; $i++) { $var = new Variable(); $this->v[$i]->expects($this->once())->method('getVariables')->will($this->returnValue([$var])); $vars[] = $var; } $this->assertSame($vars, Helper::findVariables($this->graph)); }