Hi,
Could a gatekeeper please help review the fix for bug897(
https://bugs.open64.net/show_bug.cgi?id=897)?
when we use csmith to test the compiler stability, we find the DCE always
trapped into segment fault.
A typical case:
int32_t g_46 = 0L;
int32_t g_71 = 0L;
int32_t *g_311 = &g_46;
int32_t * func_19(int32_t * p_20, int16_t p_21, int32_t * p_22, const
uint8_t
p_23, int32_t * p_24) {
int32_t **l_426 = &g_311;
const uint64_t l_440 = 0x2A1DFCF9L;
for (p_21 = (-24);
(p_21 < 1);
p_21 = safe_add_func_int16_t_s_s(p_21, 3)) {
int32_t ***l_428 = &l_426;
(*l_428) = &g_311;
if ((*p_20)) {
if (l_440) {
}
else {
uint32_t l_445 = 4U;
if ((*g_311)) {
if ((safe_rshift_func_uint16_t_u_s(func_124((&p_22 !=
&p_24)), 10))) {
(*g_311) |= l_445;
(**l_426) |= (*p_24);
g_311 = &g_71;
}
}
}
}
}
}
Analysis:
the segment fault always occurs at the dead_store_elim phase of DCE, i.e,
after the Unreachable_code_elim, and the backtrace shows the DCE tries to
mark call statement func_124 live, this is a wrong operation. the branch
else {
uint32_t l_445 = 4U;
if ((*g_311)) {
if ((safe_rshift_func_uint16_t_u_s(func_124((&p_22 !=
&p_24)), 10))) {
(*g_311) |= l_445;
(**l_426) |= (*p_24);
g_311 = &g_71;
}
}
}
has already been deleted by DCE at this point, more investigation shows,
when mark safe_add_func_int16_t_s_s(p_21, 3) live, DCE will also mark the
mu node g_311 live, which then marks the sym10v0(g_311) version live.
The sym10v0 is resurrected chi to (*g311) |= l_445, so (*g_311) |= l_445
should be marked live(at this case it should already been marked live
although removed[in deleted block]). However it is not the case, DCE tries
to mark that statement live...
the problem is we do unexpected at Remove_stmtrep:
720// remove the given statement from this block
721void
722BB_NODE::Remove_stmtrep( STMTREP *stmt )
723{
...
735 _stmtlist.Remove(stmt);
736 stmt->Reset_live_stmt(); // WHIRL SSA: mark stmt dead
737}
736 is the cause of this fault.
Suggested fix:
--- a/osprey/be/opt/opt_bb.cxx
+++ b/osprey/be/opt/opt_bb.cxx
@@ -733,7 +733,6 @@ BB_NODE::Remove_stmtrep( STMTREP *stmt )
}
_stmtlist.Remove(stmt);
- stmt->Reset_live_stmt(); // WHIRL SSA: mark stmt dead
}
Regards
Gang
------------------------------------------------------------------------------
Learn Windows Azure Live! Tuesday, Dec 13, 2011
Microsoft is holding a special Learn Windows Azure training event for
developers. It will provide a great way to learn Windows Azure and what it
provides. You can attend the event by watching it streamed LIVE online.
Learn more at http://p.sf.net/sfu/ms-windowsazure
_______________________________________________
Open64-devel mailing list
Open64-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/open64-devel