Author: shihui Date: 2011-04-06 02:03:01 -0400 (Wed, 06 Apr 2011) New Revision: 3537
Modified: trunk/osprey/be/com/constraint_graph.cxx trunk/osprey/be/com/constraint_graph_solve.cxx Log: Fix bug753: There are two main issue in ConstraintGraph::processInito and ConstraintGraph::processInitv 1. In ConstraintGraph::processInito, mem_pool is initialized and not deleted at early exit point. Cause some mem_pool not free. 2. Recursively call ConstraintGraph::processInitValues(ST) without guard if this ST is already processed. Cause allocate more unfreed mem_pool Fix 1. Call mem_pool_delete in early exit in ConstraintGraph::processInito 2. Check if an ST is already processed when recursively got ST's initialized point_to. 3. Clear local points_to variable. Code Review: Sun Chan Modified: trunk/osprey/be/com/constraint_graph.cxx =================================================================== --- trunk/osprey/be/com/constraint_graph.cxx 2011-04-06 05:54:02 UTC (rev 3536) +++ trunk/osprey/be/com/constraint_graph.cxx 2011-04-06 06:03:01 UTC (rev 3537) @@ -759,6 +759,7 @@ } ptsTo.clear(); cgNode->unionPointsTo(tmp, pti.qual()); + tmp.clear(); } } @@ -996,7 +997,12 @@ node = notAPointer(); else { // Do initial value processing for the symbol - processInitValues(ST_st_idx(base_st)); + if (ST_is_initialized(*base_st) && + (_processedInitVals.find(ST_st_idx(base_st)) == + _processedInitVals.end())) { + processInitValues(ST_st_idx(base_st)); + _processedInitVals.insert(ST_st_idx(base_st)); + } node = getCGNode(CG_ST_st_idx(base_st), base_offset); } pts.setBit(node->id()); @@ -1146,10 +1152,15 @@ node = notAPointer(); else { // Process the init vals of this symbol + if (ST_is_initialized(*base_st) && + (_processedInitVals.find(ST_st_idx(base_st)) == + _processedInitVals.end())) { + if (Get_Trace(TP_ALIAS,NYSTROM_CG_BUILD_FLAG)) + fprintf(stderr, "Processing symbol value...\n"); + processInitValues(ST_st_idx(base_st)); + _processedInitVals.insert(ST_st_idx(base_st)); + } if (Get_Trace(TP_ALIAS,NYSTROM_CG_BUILD_FLAG)) - fprintf(stderr, "Processing symbol value...\n"); - processInitValues(ST_st_idx(base_st)); - if (Get_Trace(TP_ALIAS,NYSTROM_CG_BUILD_FLAG)) fprintf(stderr, "End processing symbol value...\n"); node = getCGNode(CG_ST_st_idx(base_st), base_offset); } @@ -1332,8 +1343,11 @@ } // If the init vals did not have a pointer, ignore any initializations - if (!foundPtr) + if (!foundPtr) { + MEM_POOL_Delete(&memPool); + tmp.clear(); return; + } ConstraintGraphNode::sanitizePointsTo(tmp,NULL,CQ_NONE); ConstraintGraphNode *node = getCGNode(CG_ST_st_idx(base_st), base_offset); @@ -1344,6 +1358,8 @@ node->print(stderr); fprintf(stderr, "\n"); } + MEM_POOL_Delete(&memPool); + tmp.clear(); return; } Modified: trunk/osprey/be/com/constraint_graph_solve.cxx =================================================================== --- trunk/osprey/be/com/constraint_graph_solve.cxx 2011-04-06 05:54:02 UTC (rev 3536) +++ trunk/osprey/be/com/constraint_graph_solve.cxx 2011-04-06 06:03:01 UTC (rev 3537) @@ -333,6 +333,7 @@ } ptsTo.clear(); rep->unionPointsTo(tmp, pti.qual()); + tmp.clear(); } } } @@ -1274,6 +1275,7 @@ bool change = dst.setUnion(diff); + diff.clear(); return change; } @@ -1363,6 +1365,7 @@ printPointsTo(dst); fprintf(stderr,"\n"); } + diff.clear(); Is_True(sanityCheckPointsTo(qual), ("Node %d destination contains <ST,x> and <ST,-1>\n",id())); @@ -1456,7 +1459,6 @@ } CGNodeId trackNodeId = 0; - PointsTo origPts; UINT32 assignSize = edge->size(); StInfo *dstStInfo = dst->cg()->stInfo(dst->cg_st_idx()); @@ -1559,6 +1561,7 @@ ConstraintGraph::solverModList()->push(dst); updateOffsets(dst,tmp,dstQual); } + tmp.clear(); } } } ------------------------------------------------------------------------------ Xperia(TM) PLAY It's a major breakthrough. An authentic gaming smartphone on the nation's most reliable network. And it wants your games. http://p.sf.net/sfu/verizon-sfdev _______________________________________________ Open64-devel mailing list Open64-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/open64-devel