/** * @covers ::process * @covers ::implementSSA */ public function testOperationLoopWithPhi() { $graph = new DirectedAdjacencyList(); $a = new Variable(); $func = new Function_([$a], new Type(0), $graph); $start = new NoOp(); $noOp = new NoOp(); $jumpz = new JumpZ($noOp, $a); $graph->ensureArc($func, $start); $graph->ensureArc($start, $jumpz); $graph->ensureArc($jumpz, $r = new Return_($a)); $graph->ensureArc($r, new End()); $graph->ensureArc($jumpz, $binary = new BinaryOp(BinaryOp::PLUS, $a, new Constant(2), $a)); $graph->ensureArc($binary, $j = new Jump()); $graph->ensureArc($j, $start); $state = new GraphState($func); $compiler = new SSACompiler(); $compiler->process($state); $this->assertSame([$a], $func->getArguments()); $i = 0; foreach ($graph->successorsOf($start) as $v) { $this->assertEquals(0, $i++, 'More then one adjacent node'); $this->assertInstanceOf(Phi::class, $v); $this->assertContains($a, $v->getValues()); $this->assertSame($r->getValue(), $v->getResult()); } }