Asking the third time, why remove Reset_live_stmt() and add Set_bb(null)? Sun
On Fri, Dec 23, 2011 at 2:29 PM, Jian-Xin Lai <laij...@gmail.com> wrote: > The line is this one: > stmt->Reset_live_stmt(); // WHIRL SSA: mark stmt dead > This line is introduced by WHIRL SSA. The rename pass is in WHIRL SSA, > not in HSSA. It's different problem. > > 2011/12/23 Sun Chan <sun.c...@gmail.com>: >> I am still confused. You said you "added this line when we hit a >> bug...", which line? I also recall Fred has issue with you folks >> adding an extra rename pass. >> My question, that you have not address, is why add this Set_bb(NULL) >> and remove the line >> Reset_live_stmt()? >> Sun >> >> On Fri, Dec 23, 2011 at 2:17 PM, Jian-Xin Lai <laij...@gmail.com> wrote: >>> Set_bb(NULL) is used to distinguish the real dead code(already removed >>> from the BB) and unvisited code (marked to dead at the beginning of >>> DCE). An alternative approach is to introduce a new flag for real dead >>> code but it requires more changes. Since the statement has been >>> removed from the BB, I think it's OK to set the BB to NULL. >>> >>> I recalled the reason why I added this line when we hit a bug in WHIRL >>> SSA. It's also caused by the similar case that an opnd of phi comes >>> from a chi associated to a dead statement and the version of that phi >>> opnd is wrong. We added an extra rename pass to WHIRL SSA to correct >>> the version. With the extra rename pass, this change becomes >>> unnecessary. (This rename pass is necessary because the WHIRL CFG is >>> not identical to HSSA CFG and the rename pass is needed to correct the >>> order of phi opnds.) >>> >>> 2011/12/22 Sun Chan <sun.c...@gmail.com>: >>>> can you go over why the second change, set_BB(null)? And remove the >>>> mark Reset_live_stmt()? >>>> Sun >>>> >>>> On Thu, Dec 22, 2011 at 3:54 PM, Jian-Xin Lai <laij...@gmail.com> wrote: >>>>> Hi, >>>>> >>>>> Here is a smaller case for bug #897 and a new patch based on Gang's >>>>> current work. Could a gatekeeper review it? Thank you very much. >>>>> >>>>> A smaller case: >>>>> 1 int g_1; >>>>> 2 int* g_2; >>>>> 3 int* func(int* p_1, short p_2) { >>>>> 4 int **l_1; >>>>> 5 const unsigned long l_2 = 0x2A1DFCF9L; >>>>> 6 for ( ; ; p_2 = foo() ) { >>>>> 7 int ***l_3 = &l_1; >>>>> 8 (*l_3) = &g_2; >>>>> 9 if (!l_2) { >>>>> 10 // The following code is unreachable >>>>> 11 if ((bar())) { >>>>> 12 (*g_2) |= g_1; >>>>> 13 (**l_1) |= (*p_1); >>>>> 14 g_2 = &g_1; >>>>> 15 } >>>>> 16 } >>>>> 17 } >>>>> 18 } >>>>> >>>>> in DCE phase, the unreachable code elimination runs at first and all >>>>> the statements in the if block is removed and set to NOT_LIVE. In the >>>>> later Dead store elimination phase, as Gang's explaination, we follow >>>>> the U-D chain of g_2, which is a global variable and has CHI on line >>>>> 6(foo), 11(bar), 12 (*g_2) and a real dec in line 14. When we mark the >>>>> call of foo (line 6) to be LIVE, the CHI of g_2 is also LIVE and >>>>> following the U-D chain, the CHI's on bar() and (*g_2) is also marked >>>>> to LIVE. When marking (*g_2) to live, we also mark that BB to live. >>>>> But the BB is empty (all statements have been removed in earlier >>>>> phase) and the assertion occures. >>>>> >>>>> Here is a new patch: >>>>> Index: osprey/be/opt/opt_dce.cxx >>>>> =================================================================== >>>>> --- osprey/be/opt/opt_dce.cxx (revision 3855) >>>>> +++ osprey/be/opt/opt_dce.cxx (working copy) >>>>> @@ -2619,7 +2619,10 @@ >>>>> // NOTE: May at some time always have a defining statement, so >>>>> // we could remove the check for a null defstmt >>>>> // (i.e., if live-in values get some dummy def stmt) >>>>> - if ( cr->Defstmt() != NULL && !cr->Defstmt()->Live_stmt() ) { >>>>> + // if defining statement doesn't belong to any BB, it's been >>>>> + // removed in early unreachable code elimination phase. >>>>> + if ( cr->Defstmt() != NULL && !cr->Defstmt()->Live_stmt() && >>>>> + cr->Defstmt()->Bb() != NULL ) { >>>>> // if we're making this statement live just because it's >>>>> // associated with a chi, see if we can get rid of "i = i" >>>>> // assignments. This only happens when zero-version is >>>>> Index: osprey/be/opt/opt_bb.cxx >>>>> =================================================================== >>>>> --- osprey/be/opt/opt_bb.cxx (revision 3855) >>>>> +++ osprey/be/opt/opt_bb.cxx (working copy) >>>>> @@ -734,6 +734,7 @@ >>>>> >>>>> _stmtlist.Remove(stmt); >>>>> - stmt->Reset_live_stmt(); // WHIRL SSA: mark stmt dead >>>>> + stmt->Set_bb(NULL); >>>>> } >>>>> >>>>> void >>>>> >>>>> If the statement has been removed from the BB, we reset its BB to >>>>> NULL. In the later phase, if a statement's BB is NULL, which means the >>>>> statement has been removed and we don't need to mark it to live. >>>>> Reseting the bb of dead statement to NULL also helps preventing more >>>>> bugs when trying to traverse the BB. >>>>> >>>>> -- >>>>> Regards, >>>>> Lai Jian-Xin >>>>> >>>>> ------------------------------------------------------------------------------ >>>>> Write once. Port to many. >>>>> Get the SDK and tools to simplify cross-platform app development. Create >>>>> new or port existing apps to sell to consumers worldwide. Explore the >>>>> Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join >>>>> http://p.sf.net/sfu/intel-appdev >>>>> _______________________________________________ >>>>> Open64-devel mailing list >>>>> Open64-devel@lists.sourceforge.net >>>>> https://lists.sourceforge.net/lists/listinfo/open64-devel >>> >>> >>> >>> -- >>> Regards, >>> Lai Jian-Xin > > > > -- > Regards, > Lai Jian-Xin ------------------------------------------------------------------------------ Write once. Port to many. Get the SDK and tools to simplify cross-platform app development. Create new or port existing apps to sell to consumers worldwide. Explore the Intel AppUpSM program developer opportunity. appdeveloper.intel.com/join http://p.sf.net/sfu/intel-appdev _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel