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 ------------------------------------------------------------------------------ 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