private function readVariableRecursive($name, Block $block)
{
if ($this->ctx->complete) {
if (count($block->parents) === 1 && !$block->parents[0]->dead) {
// Special case, just return the read var
return $this->readVariableName($name, $block->parents[0]);
}
$var = new Operand\Temporary(new Variable(new Literal($name)));
$phi = new Op\Phi($var, ["block" => $block]);
$block->phi[] = $phi;
// Prevent unbound recursion
$this->writeVariableName($name, $var, $block);
foreach ($block->parents as $parent) {
if ($parent->dead) {
continue;
}
$phi->addOperand($this->readVariableName($name, $parent));
}
return $var;
}
$var = new Operand\Temporary(new Variable(new Literal($name)));
$phi = new Op\Phi($var, ["block" => $block]);
$this->ctx->addToIncompletePhis($block, $name, $phi);
$this->writeVariableName($name, $var, $block);
return $var;
}