[tree-ssa vs lno] who is right?
Devang Patel
dpatel@apple.com
Fri Mar 26 21:09:00 GMT 2004
On Mar 26, 2004, at 10:22 AM, Dale Johannesen wrote:
>
> On Mar 26, 2004, at 10:10 AM, Zdenek Dvorak wrote:
>
>> Hello,
>>
>>> When the LNO branch copies a loop, it attempts to fix up the phi
>>> nodes
>>> with
>>> an algorithm that assumes there is only one phi per block per
>>> variable.
>>> That is, it
>>> won't see code like this:
>>
>> (i.e. what do you mean by "copying a loop")?
>
> tree_duplicate_loop_to_header_edge (called from unswitching in the
> failing case)
I saw this happening couple of days ago at this point in
tree_duplicate_loop...
/* Add phi nodes for definitions to exit_block (we could find out
which of them are really used outside of the loop and don't
emit the
phi nodes for the remaining ones; for this we would however
need
to know immediate uses). */
for (arg = usable_outside; arg; arg = TREE_CHAIN (arg))
{
def = TREE_VALUE (arg);
phi = create_phi_node (def, exit_block);
for (ae = exit_block->pred; ae; ae = ae->pred_next)
add_phi_arg (&phi, def, ae);
}
>> where do we assume this
>
> lv_adjust_loop_header_phi . The assumption is explicit:
>
> /* There can not be second phi node for the same
> variable.
> Get out of the for loop that walks phi nodes
> of 'first'.
> */
Yes, that's what my understanding was (until this thread). I'm glad I
note down my assumptions.
> There isn't any way to find the right phi at that point AFAICT,
That's what I found at that time... here is what I am trying to do
in lv_adjust_loop_header_phi
/* Adjust phi nodes for 'first' basic block. 'second' basic block is a
copy
of 'first'. Both of them are dominated by 'new_head' basic block.
When
'new_head' was created by [splitting] 'second's incoming edge it
received phi arguments
on the edge by split_edge(). Later, additional edge 'e' was created
to
connect 'new_head' and 'first'. Now this routnine adds phi args on
this
additional edge 'e' that new_head to second edge received as part of
edge
splitting.
*/
-
Devang
> so I'm thinking
> along the lines of making sure the phi lists are in the same order
> when doing
> the loop duplication earlier (they aren't now).
>
>> While this certainly is unlikely to happen, there probably is nothing
>> that would prevent it.
>
>> Zdenek
>>
>>> ;; basic block 19, loop depth 0, count 0
>>> ;; prev block 9, next block 20
>>> ;; pred: 10 [100.0%] (fallthru)
>>> ;; succ: 28 [50.0%] (true,exec) 29 [50.0%] (false,exec)
>>> # maxmin_Result_140 = PHI <1(10)>;
>>> # maxmin_Result_142 = PHI <2(10)>;
>>> # lsm_tmp.19_144 = PHI <lsm_tmp.19_84(10)>;
>>> <L28>:;
>>> if (m__10 == 0) goto <L26>; else goto <L27>;
>>>
>>> Is that suppose to be a valid assumption? The dup is created by
>>> copyrename, and
>>> I see no code there that's intended to stop dups from being created
>>> (on
>>> the
>>> contrary, but surely it's unusual for the live ranges to overlap).
>>>
More information about the Gcc
mailing list