- ir_node *res;
- /* There are 4 cases to treat.
-
- 1. The block is not mature and we visit it the first time. We can not
- create a proper Phi node, therefore a Phi0, i.e., a Phi without
- predecessors is returned. This node is added to the linked list (field
- "link") of the containing block to be completed when this block is
- matured. (Comlpletion will add a new Phi and turn the Phi0 into a Id
- node.)
-
- 2. The value is already known in this block, graph_arr[pos] is set and we
- visit the block the first time. We can return the value without
- creating any new nodes.
-
- 3. The block is mature and we visit it the first time. A Phi node needs
- to be created (phi_merge). If the Phi is not needed, as all it's
- operands are the same value reaching the block through different
- paths, it's optimizes away and the value itself is returned.
-
- 4. The block is mature, and we visit it the second time. Now two
- subcases are possible:
- * The value was computed completely the last time we were here.
- This is the case if there is no loop. We can return the proper value.
- * The recursion that visited this node and set the flag did not
- return yet. We are computing a value in a loop and need to
- break the recursion without knowing the result yet.
- There is no simple check for the second subcase. Therefore we check
- for a second visit and treat all such cases as the second subcase.
- Anyways, the basic situation is the same: we reached a block
- on two paths without finding a definition of the value: No Phi
- nodes are needed on both paths.
- We return this information "Two paths, no Phi needed" by a very tricky
- implementation that relies on the fact that an obstack is a stack and
- will return a node with the same address on different allocations.
- Look also at phi_merge and get_r_phi_in to understand this.
- */
-
- /* case 4 -- already visited. */
- if (block->visit == ir_visited) return NULL;
-
- /* visited the first time */
- block->visit = ir_visited;
-
- /* Get the local valid value */
- res = block->attr.block.graph_arr[pos];
-
- /* case 2 -- If the value is actually computed, return it. */
- if (res) { return res;};
-
- if (block->attr.block.matured) { /* case 3 */
-
- /* The Phi has the same amount of ins as the corresponding block. */
- int ins = get_irn_arity(block); // ARR_LEN (block->in)-1;
- ir_node **nin;
- NEW_ARR_A (ir_node *, nin, ins);