Hello, I've encountered a problem similar to 'lost-copy' when using the StrongPhiElimination and wonder whether it is a incompatibility issue between the two different algorithms used in StrongPhiElimination.cpp. The StrongPhiElimination is mostly based on the algorithm in Zoran Budimilic et al's "Fast Copy Coalescing and Live-Range Identification" ([1]), while the 'Copy Insertion' part is from Preston Briggs et al's "Practical Improvements to the Construction and Destruction of Static Single Assignment Form" ([2]). The test case I have is as follows, Block 1 r1 = ... if (...) goto Block 2 else goto Block 3 Block 2 r2 = ... goto Block 4 Block 3 r3 = phi(r1, r4) r4 = ... if (...) goto Block 3 else goto Block 4 Block 4 r5 = phi(r2, r3) ... = r5 Since the live range of r2, r3, and r5 do not interference, StrongPhiElimination decides, before InsertCopies(), to rename both r2 and r3 to r5 based onthe algorithm in [1] During InsertCopies(), because 'r3' is live after Block 3 and this is the typical case where 'lost-copy' could happen, StrongPhiEilimination inserts a copy from r3 to a temp register r99 based on the algorithm in [2]. Block 3 then becomes Block 3 r3 = phi(r1, r4) r99 = r3 r4 = ... r3 = r4 if (...) goto Block 3 else (...) goto Block 4 The Insert-copy algorithm in [2] would normally rename r3 in Block 4 to r99. But StrongPhiEliminination decides unify 'r5', 'r2' and 'r3' instead of inserting copies for 'r5=phi(r2, r3)' in Block 4, therefore the 'waiting' set for Block 4 is empty. 'r3' is not renamed to 'r99' in StrongPhiElimination. Then StrongPhiElimination proceeds to the renaming phase and rename both r2 and r3 to r5. The final code becomes Block 1 r1 = ... r5 = r1 if (...) goto Block 2 else goto Block 3 Block 2 r5 = ... goto Block 4 Block 3 r99 = r5 r4 = ... r5 = r4 if (...) goto Block 3 else (...) goto Block 4 Block 4 ... = r5 The value of r5 in Block 4 is wrong when the path Block 1->Block 3->Block 4 is taken. I must say I still do not fully understand the implementation in StrongPhiElimination, especially the live range checking and updating code. The above is just based my understand from reading the code, [1], [2], the incorrect result I get and he output from my debug session. Is this a real problem? What am I missing? Thanks! -- Yuan