You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by va...@apache.org on 2007/06/07 13:47:08 UTC
svn commit: r545149 - in
/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer: escanalyzer.cpp
escanalyzer.h
Author: varlax
Date: Thu Jun 7 04:47:07 2007
New Revision: 545149
URL: http://svn.apache.org/viewvc?view=rev&rev=545149
Log:
Applied HARMONY-4031 [drlvm][jit]Incorrect escape state is set for callee's returned value
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp?view=diff&rev=545149&r1=545148&r2=545149
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp Thu Jun 7 04:47:07 2007
@@ -1497,14 +1497,16 @@
NodeMDs::iterator it1;
for (it = cngNodes->begin( ); it != cngNodes->end( ); it++ ) {
- if ((*it)->nodeType==NT_STFLD) {
+ uint32 nt = (*it)->nodeType;
+ if (nt==NT_STFLD || nt==NT_CATCHVAL
+ || (nt==NT_RETVAL && (*it)->nInst->getOpcode()==Op_IndirectMemoryCall)
+ || (nt==NT_RETVAL && (*it)->nInst->asMethodInst()->getMethodDesc()->isNative())) {
initNodeType = NT_STFLD;
#ifdef _DEBUG
if (_setState) {
Log::out() <<"-- before scanGE: nodeId "
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId<<" state ";
- printState(*it);
- Log::out() << std::endl;
+ printState(*it); Log::out() << std::endl;
}
#endif
scanCnGNodeRefsGE(*it,false);
@@ -1513,19 +1515,18 @@
scannedObjs->clear();
scannedObjsRev->clear();
for (it = cngNodes->begin( ); it != cngNodes->end( ); it++ ) {
- if ((*it)->nodeType&NT_EXITVAL || (*it)->nodeType==NT_DEFARG) { // returned, thrown || defarg
+ if ((*it)->nodeType&NT_EXITVAL || (*it)->nodeType==NT_DEFARG) { // returned, thrown , defarg
#ifdef _DEBUG
if (_setState) {
Log::out() <<"-- before scanEVDA: nodeId "
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId<<" state ";
- printState(*it);
- Log::out() << std::endl;
+ printState(*it); Log::out() << std::endl;
}
#endif
initNodeType = (*it)->nodeType;
scanCnGNodeRefsGE(*it,false);
- scannedObjs->clear(); //
- scannedObjsRev->clear(); //
+ scannedObjs->clear();
+ scannedObjsRev->clear();
}
}
scannedObjs->clear();
@@ -1537,8 +1538,7 @@
if (_setState) {
Log::out() <<"-- before scanAE: nodeId "
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId<<" state ";
- printState(*it);
- Log::out() << std::endl;
+ printState(*it); Log::out() << std::endl;
}
#endif
initNodeType = NT_ACTARG;
@@ -1569,8 +1569,7 @@
<<(*it)->cngNodeId<<" opId "
<<(*it)->opndId<<" state ";
printState(*it);
- Log::out()
- <<" to set loop" << std::endl;
+ Log::out() <<" to set loop" << std::endl;
}
#endif
setLoopCreated(*it);
@@ -1599,13 +1598,11 @@
Log::out()<<"--setSt chk arg_esc: nodeId " <<(*it)->cngNodeId
<<" opId " <<(*it)->opndId<<" state ";
printState(*it); Log::out() << std::endl;
- Log::out() << " ";
- callInst->print(Log::out());
+ Log::out() << " "; callInst->print(Log::out());
Log::out() << std::endl;
}
#endif
if (mdesc->isNative()) { // not scanned native methods
-
setEscState(*it,GLOBAL_ESCAPE);
#ifdef _DEBUG
if (_scanMtds==1) {
@@ -1661,18 +1658,11 @@
<< mdesc->isStatic() << std::endl;
Log::out() << " isFinal: "
<< mdesc->isFinal() << std::endl;
-
Log::out() << "---------------" << std::endl;
Log::out() << " NumParams: "
<< mdesc->getNumParams()<< std::endl;
- Log::out() << " isNative: "
- << mdesc->isNative() << std::endl;
- Log::out() << " isStatic: "
- << mdesc->isStatic() << std::endl;
Log::out() << " isInstance: "
<< mdesc->isInstance() << std::endl;
- Log::out() << " isFinal: "
- << mdesc->isFinal() << std::endl;
Log::out() << " isVirtual: "
<< mdesc->isVirtual() << std::endl;
Log::out() << " isAbstract: "
@@ -1681,15 +1671,13 @@
<< mdesc->isInstanceInitializer() << std::endl;
Log::out() << " isOverridden: "
<< mdesc->isOverridden() << std::endl;
-
}
if (_setState) {
Log::out() <<"--setSt 2: nodeId "
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId
<<" state ";
printState(*it);
- Log::out() <<" to v.call."
- << std::endl;
+ Log::out() <<" to v.call." << std::endl;
}
#endif
continue; //break;
@@ -1703,8 +1691,7 @@
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId
<<" state ";
printState(*it);
- Log::out() <<" to gl.esc."
- << std::endl;
+ Log::out() <<" to gl.esc." << std::endl;
}
#endif
break;
@@ -1727,8 +1714,7 @@
Log::out()
<<(*it2)->paramNumber<<" == "<<narg<<" state "
<<(*it2)->state <<" < "<< getEscState(*it)<<" ";
- printState(*it);
- Log::out() << std::endl;
+ printState(*it); Log::out() << std::endl;
}
#endif
if ((*it2)->paramNumber == narg) { //???to add scanning of contained obj
@@ -1739,8 +1725,7 @@
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId
<<" state ";
printState(*it);
- Log::out() <<" to state "
- <<state<< std::endl;
+ Log::out() <<" to state " <<state<< std::endl;
}
#endif
setEscState(*it,state);
@@ -1750,7 +1735,23 @@
}
}
if (getEscState(*it)==GLOBAL_ESCAPE) { // to set gl.escape for contained objects
- scanCnGNodeRefsGE(*it,false);
+ initNodeType = NT_STFLD;
+ CnGNode* cn = *it;
+ CnGNode* nn = NULL;
+ CnGRefs::iterator it2;
+ if (cn->nodeType == NT_LDOBJ) {
+ scanCnGNodeRefsGE(cn,true);
+ } else {
+ if (cn->outEdges != NULL) {
+ for (it2 = cn->outEdges->begin( ); it2 != cn->outEdges->end( ); it2++ ) {
+ nn = (*it2)->cngNodeTo;
+ if (getEscState(nn)==GLOBAL_ESCAPE) {
+ continue;
+ }
+ scanCnGNodeRefsGE(nn,false);
+ }
+ }
+ }
scannedObjs->clear();
scannedObjsRev->clear();
}
@@ -1758,42 +1759,10 @@
}
for (it = cngNodes->begin( ); it != cngNodes->end( ); it++ ) {
uint32 nt = (*it)->nodeType;
- if ((nt&NT_RETVAL) && getEscState(*it)>GLOBAL_ESCAPE) {
- if (nt==NT_CATCHVAL || ((*it)->nInst->getOpcode())==Op_IndirectMemoryCall) {
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--setCOS 1: nodeId "
- <<(*it)->cngNodeId<<" opId "<<(*it)->opndId <<" state ";
- printState(*it);
- Log::out() <<" to gl.esc."<< std::endl;
- }
-#endif
- setEscState(*it,GLOBAL_ESCAPE);
- continue;
- }
+ if ((nt==NT_RETVAL) && getEscState(*it)>GLOBAL_ESCAPE) {
MethodDesc* mdesc = (*it)->nInst->asMethodInst()->getMethodDesc();
- if (mdesc->isNative()) { // not scanned native methods
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--setCOS 2: nodeId "
- <<(*it)->cngNodeId<<" opId "<<(*it)->opndId <<" state ";
- printState(*it);
- Log::out() <<" to gl.esc."<< std::endl;
- }
-#endif
- setEscState(*it,GLOBAL_ESCAPE);
- continue;
- }
- if (((*it)->nInst->getOpcode())!=Op_DirectCall) {
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--setCOS 3: nodeId "
- <<(*it)->cngNodeId<<" opId "<<(*it)->opndId <<" state ";
- printState(*it);
- Log::out() <<" to gl.esc."<< std::endl;
- }
-#endif
- setEscState(*it,GLOBAL_ESCAPE);
+ if (((*it)->nInst->getOpcode())!=Op_DirectCall) { // only direct call may be here
+ assert(0);
continue;
}
CalleeMethodInfo* mthInfo = findMethodInfo(mdesc,(*it)->nInst);
@@ -1802,13 +1771,13 @@
if (_setState) {
Log::out() <<"--setCOS 4: nodeId "
<<(*it)->cngNodeId<<" opId "<<(*it)->opndId <<" state ";
- printState(*it);
- Log::out() <<" to gl.esc."<< std::endl;
+ printState(*it); Log::out() <<" to gl.esc."<< std::endl;
}
#endif
- setEscState(*it,GLOBAL_ESCAPE);
+ initNodeType = NT_STFLD;
+ scanCnGNodeRefsGE(*it,false);
} else {
- if (getEscState(*it)>((mthInfo->retValueState)&ESC_MASK)) {
+ if (getEscState(*it)>((mthInfo->retValueState)&ESC_MASK) || getOutEscaped(*it)==0) {
#ifdef _DEBUG
if (_setState) {
Log::out() <<"--setCOS 5: nodeId "
@@ -1817,7 +1786,12 @@
Log::out() <<" to "<< mthInfo->retValueState<< std::endl;
}
#endif
- setEscState(*it,(mthInfo->retValueState)&ESC_MASK);
+ if (((mthInfo->retValueState)&ESC_MASK) == GLOBAL_ESCAPE) {
+ initNodeType = NT_STFLD; // global_escape propagate
+ } else {
+ initNodeType = NT_EXITVAL; // out_escaped propagate
+ }
+ scanCnGNodeRefsGE(*it,false);
}
}
}
@@ -1825,7 +1799,7 @@
scannedObjs->clear();
scannedObjsRev->clear();
scannedSucNodes->clear();
- // check states of array elements and fields values
+ // check states of array elements' and fields' values
for (it = cngNodes->begin( ); it != cngNodes->end( ); it++ ) {
uint32 nt = (*it)->nodeType;
if ((nt&(NT_OBJECT|NT_RETVAL) || nt==NT_LDOBJ) && (getEscState(*it)!=GLOBAL_ESCAPE)) {
@@ -1843,30 +1817,7 @@
scannedObjsRev->clear();
scannedSucNodes->clear();
}
- uint32 rs = NO_ESCAPE;
- CnGRefs::iterator it2;
- CnGNode* cgn;
- // set escape state for NT_EXITVAL nodes
- for (it = cngNodes->begin( ); it != cngNodes->end( ); it++) {
- if ((*it)->nodeType==NT_EXITVAL) {
- if ((*it)->outEdges ==NULL)
- continue;
- for (it2 = (*it)->outEdges->begin( ); it2 != (*it)->outEdges->end( ); it2++ ) {
- cgn = (*it2)->cngNodeTo;
- if (getEscState(cgn)<=(rs&ESC_MASK))
- rs = getFullState(cgn);
- }
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--setCOS 7: nodeId "
- <<(*it)->cngNodeId<<" opId "<<(*it)->opndId <<" state ";
- printState(*it);
- Log::out() <<" to "<< rs << std::endl;
- }
-#endif
- setFullState(*it,rs);
- }
- }
+
} // setCreatedObjectStates()
@@ -1876,9 +1827,12 @@
CnGRefs::iterator it1;
CnGNode* next_node;
ObjIds* scObjs = check_var_src ? scannedObjsRev : scannedObjs;
- uint32 nscan=0;
uint32 ni_opcode = cgn->nInst->getOpcode();
+ bool needFix = isStateNeedGEFix(getFullState(cgn),cgn->nodeType);
+ if (cgn->nodeType != NT_STFLD && cgn->nodeType != NT_THRVAL && cgn->nodeType != NT_EXITVAL
+ && cgn->nodeType != NT_DEFARG && cgn->nodeType != NT_RETVAL && cgn->nodeType != NT_LDOBJ)
+ assert(needFix);
#ifdef _DEBUG
if (_setState) {
Log::out() <<"--scanGE 1: nodeId "<<cgn->cngNodeId
@@ -1906,78 +1860,88 @@
return;
}
}
- if (cgn->nodeType&NT_OBJS) {
- if (initNodeType!=NT_EXITVAL && initNodeType!=NT_DEFARG) { //
- if (getEscState(cgn) > GLOBAL_ESCAPE) {
+
+ if (initNodeType!=NT_EXITVAL && initNodeType!=NT_DEFARG) { //
+ if (getEscState(cgn) > GLOBAL_ESCAPE) {
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--scanGE 2: nodeId "
- <<cgn->cngNodeId<<" opId "<<cgn->opndId <<" state ";
- printState(cgn);
- Log::out() <<" to gl.esc."<< std::endl;
- Log::out() <<"--scanGE 2: "<< nodeTypeToString(cgn)
- << cgn->nodeType <<" initNode "<<initNodeType<< std::endl;
- }
-#endif
- setEscState(cgn,GLOBAL_ESCAPE);
+ if (_setState) {
+ Log::out() <<"--scanGE 2: nodeId "
+ <<cgn->cngNodeId<<" opId "<<cgn->opndId <<" state ";
+ printState(cgn);
+ Log::out() <<" to gl.esc."<< std::endl;
+ Log::out() <<"--scanGE 2: "<< nodeTypeToString(cgn)
+ << cgn->nodeType <<" initNode "<<initNodeType<< std::endl;
}
- }
- if (initNodeType==NT_EXITVAL) {
- if (getOutEscaped(cgn) == 0) {
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--scanGE 3: nodeId "
- <<cgn->cngNodeId<<" opId "<<cgn->opndId <<" state ";
- printState(cgn);
- Log::out() <<" to callee.esc."<< std::endl;
- Log::out() <<"--scanGE 3: "<< nodeTypeToString(cgn)
- << cgn->nodeType <<" initNode "<<initNodeType<< std::endl;
- }
#endif
- setOutEscaped(cgn);
- }
- // The objects created in the method are not global escaped through return
+ setEscState(cgn,GLOBAL_ESCAPE);
}
- if (initNodeType==NT_DEFARG) {
- if (getOutEscaped(cgn) == 0) {
+ }
+ if (initNodeType==NT_EXITVAL) {
+ if (getOutEscaped(cgn) == 0) {
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--scanGE 4: nodeId "
- <<cgn->cngNodeId<<" opId "<<cgn->opndId <<" state ";
- printState(cgn);
- if (cgn->nodeType == NT_OBJECT ) {
- Log::out() <<" to gl.esc."<< std::endl;
- } else {
- Log::out() <<" to callee.esc."<< std::endl;
- }
- Log::out() <<"--scanGE 4: "<< nodeTypeToString(cgn)
- << cgn->nodeType <<" initNode "<<initNodeType<< std::endl;
- }
+ if (_setState) {
+ Log::out() <<"--scanGE 3: nodeId "
+ <<cgn->cngNodeId<<" opId "<<cgn->opndId <<" state ";
+ printState(cgn);
+ Log::out() <<" to out.esc."<< std::endl;
+ Log::out() <<"--scanGE 3: "<< nodeTypeToString(cgn)
+ << cgn->nodeType <<" initNode "<<initNodeType<< std::endl;
+ }
#endif
- if (cgn->nodeType == NT_OBJECT ) {
- setEscState(cgn,GLOBAL_ESCAPE); //objects escaped through defarg - global escape
+ setOutEscaped(cgn);
+ }
+ // The objects created in the method are not global escaped through return
+ }
+ if (initNodeType==NT_DEFARG) {
+ if (needFix) {
+#ifdef _DEBUG
+ if (_setState) {
+ Log::out() <<"--scanGE 4: nodeId "
+ <<cgn->cngNodeId<<" opId "<<cgn->opndId <<" state ";
+ printState(cgn);
+ if (cgn->nodeType == NT_OBJECT || cgn->nodeType == NT_LDOBJ || cgn->nodeType == NT_RETVAL) {
+ Log::out() <<" to gl.esc."<< std::endl;
} else {
- setOutEscaped(cgn);
- }
+ Log::out() <<" to out.esc."<< std::endl;
+ }
+ Log::out() <<"--scanGE 4: "<< nodeTypeToString(cgn)
+ << cgn->nodeType <<" initNode "<<initNodeType<< std::endl;
+ }
+#endif
+ if (cgn->nodeType == NT_OBJECT || cgn->nodeType == NT_LDOBJ || cgn->nodeType == NT_RETVAL) {
+ setEscState(cgn,GLOBAL_ESCAPE); //objects escaped through defarg - global escape
+ } else {
+ setOutEscaped(cgn);
}
}
}
scObjs->push_back(cgn->cngNodeId);
if (cgn->outEdges != NULL) {
- bool to_check_var_src = check_var_src;
+ bool to_check_var_src = false;
for (it1 = cgn->outEdges->begin( ); it1 != cgn->outEdges->end( ); it1++ ) {
next_node = (*it1)->cngNodeTo;
- if (next_node->nodeType == NT_LDOBJ)
- if (next_node->nInst->getOpcode()==Op_LdVar && cgn->nodeType!=NT_VARVAL)
- to_check_var_src = true;
+ needFix = isStateNeedGEFix(getFullState(next_node),next_node->nodeType);
+ if (!needFix) {
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--scanGE 5 next: nodeId "
- <<next_node->cngNodeId<<" opId "<<next_node->opndId <<" state ";
- printState(next_node); Log::out() << std::endl;
+ if (_setState) {
+ Log::out() <<"--scanGE 5.0 next: already set ";
+ printState(next_node); Log::out() << std::endl;
}
#endif
+ continue;
+ }
+ if (next_node->nodeType == NT_LDOBJ && next_node->nInst->getOpcode()==Op_LdVar
+ && cgn->nodeType!=NT_VARVAL) {
+ to_check_var_src = true;
+ }
+#ifdef _DEBUG
+ if (_setState) {
+ Log::out() <<"--scanGE 5 next: nodeId "
+ <<next_node->cngNodeId<<" opId "<<next_node->opndId <<" state ";
+ printState(next_node); Log::out() << std::endl;
+ }
+#endif
scanCnGNodeRefsGE(next_node,to_check_var_src);
#ifdef _DEBUG
if (_setState) {
@@ -1985,8 +1949,6 @@
<<" opId " << next_node->opndId << std::endl;
}
#endif
- if ((*it1)->edgeType!=ET_POINT)
- nscan++;
}
}
if (check_var_src) {
@@ -1994,6 +1956,16 @@
uint32 nsrc=cgn->nInst->getNumSrcOperands();
for (uint32 i=0; i<nsrc; i++) {
next_node = findCnGNode_op(cgn->nInst->getSrc(i)->getId());
+ needFix = isStateNeedGEFix(getFullState(next_node),next_node->nodeType);
+ if (!needFix) {
+#ifdef _DEBUG
+ if (_setState) {
+ Log::out() <<"--scanGE 6.0 next: already set ";
+ printState(next_node); Log::out() << std::endl;
+ }
+#endif
+ continue;
+ }
#ifdef _DEBUG
if (_setState) {
Log::out() <<"--scanGE 6 next: nodeId "
@@ -2011,11 +1983,6 @@
}
}
}
-#ifdef _DEBUG
- if (_setState) {
- Log::out()<<"--scanGE: nscan "<<nscan<<" opId "<<cgn->opndId<<std::endl;
- }
-#endif
} // scanCnGNodeRefsGE(CnGNode* cgn, bool check_var_src)
@@ -2026,9 +1993,13 @@
CnGRefs::iterator it1;
CnGNode* next_node;
ObjIds* scObjs = check_var_src ? scannedObjsRev : scannedObjs;
- uint32 nscan=0;
uint32 ni_opcode = cgn->nInst->getOpcode();
+ uint32 curMDNode_saved = 0;
+ if (curMDNode == 0) {
+ assert(getEscState(cgn)!=ARG_ESCAPE);
+ }
+ assert(getEscState(cgn)!=GLOBAL_ESCAPE);
#ifdef _DEBUG
if (_setState) {
Log::out() <<"--scanAE < 1: nodeId "<<cgn->cngNodeId
@@ -2056,41 +2027,41 @@
return;
}
}
- if (getEscState(cgn) < ARG_ESCAPE) { // not scan global escaped
+
+ if (cgn->nodeType == NT_ACTARG) {
+ curMDNode_saved = curMDNode;
+ }
+
+ if (cgn->nodeMDs!=NULL && curMDNode!=0) {
+ cgn->nodeMDs->push_back(curMDNode);
#ifdef _DEBUG
if (_setState) {
- Log::out() <<"--scanAE > 3: global escaped " << std::endl;
+ Log::out() <<"--scanAE 1_1: nodeId "<<cgn->cngNodeId
+ <<" opId "<<cgn->opndId <<" curMDNode "<<curMDNode<< std::endl;
}
#endif
- return;
}
- if (cgn->nodeType&NT_OBJS) {
- if (cgn->nodeMDs!=NULL && curMDNode!=0) {
- cgn->nodeMDs->push_back(curMDNode);
+ if (getEscState(cgn) > ARG_ESCAPE) {
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--scanAE 1_1: nodeId "<<cgn->cngNodeId
- <<" opId "<<cgn->opndId <<" curMDNode "<<curMDNode<< std::endl;
- }
-#endif
+ if (_setState) {
+ Log::out() <<"--scanAE 2: nodeId "<<cgn->cngNodeId
+ <<" opId "<<cgn->opndId<<" state ";
+ printState(cgn);
+ Log::out() <<" to arg.esc."<< std::endl;
}
- if (getEscState(cgn) > ARG_ESCAPE) {
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--scanAE 2: nodeId "<<cgn->cngNodeId
- <<" opId "<<cgn->opndId<<" state ";
- printState(cgn);
- Log::out() <<" to arg.esc."<< std::endl;
- }
#endif
- setEscState(cgn,ARG_ESCAPE);
- }
+ setEscState(cgn,ARG_ESCAPE);
}
+
scObjs->push_back(cgn->cngNodeId);
if (cgn->outEdges != NULL) {
bool to_check_var_src = check_var_src;
for (it1 = cgn->outEdges->begin( ); it1 != cgn->outEdges->end( ); it1++ ) {
next_node = (*it1)->cngNodeTo;
+ if (getEscState(next_node) < ARG_ESCAPE)
+ continue;
+ if (getEscState(next_node) == ARG_ESCAPE && cgn->nodeType != NT_ACTARG)
+ continue;
#ifdef _DEBUG
if (_setState) {
Log::out() <<"--scanAE 3 next: nodeId "
@@ -2106,8 +2077,7 @@
if (next_node->nInst->getOpcode()==Op_LdVar && cgn->nodeType!=NT_VARVAL)
to_check_var_src = true;
scanCnGNodeRefsAE(next_node,to_check_var_src);
- if ((*it1)->edgeType!=ET_POINT)
- nscan++;
+ curMDNode = curMDNode_saved;
}
}
if (check_var_src) {
@@ -2115,6 +2085,8 @@
uint32 nsrc=cgn->nInst->getNumSrcOperands();
for (uint32 i=0; i<nsrc; i++) {
next_node = findCnGNode_op(cgn->nInst->getSrc(i)->getId());
+ if (getEscState(next_node) <= ARG_ESCAPE)
+ continue;
#ifdef _DEBUG
if (_setState) {
Log::out() <<"--scanAE 4 next: nodeId "
@@ -2123,6 +2095,7 @@
}
#endif
scanCnGNodeRefsAE(next_node,check_var_src);
+ curMDNode = curMDNode_saved;
}
}
}
@@ -2141,14 +2114,16 @@
void
EscAnalyzer::checkSubobjectStates(CnGNode* node) {
CnGRefs::iterator it;
+ CnGRefs::iterator it1;
CnGNode* cgn;
CnGNode* cgn1;
+ CnGNode* node_fld;
bool arge = false;
bool calle = false;
bool gle = false;
bool no_mod = false;
- Inst* n_inst = node->nInst;;
- CnGNode* nt = node;
+ Inst* n_inst = node->nInst;
+ CnGNode* nt = NULL;
#ifdef _DEBUG
if (_setState) {
@@ -2156,16 +2131,6 @@
printCnGNode(node,Log::out());Log::out() << std::endl;
}
#endif
- if (scannedSucNodes->size()!=0) {
- if (checkScannedSucNodes(node->cngNodeId)) {
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--checkSOS ... : return " << std::endl;
- }
-#endif
- return;
- }
- }
if (node->outEdges==NULL) {
#ifdef _DEBUG
if (_setState) {
@@ -2175,94 +2140,104 @@
return;
}
- for (it = node->outEdges->begin( ); it != node->outEdges->end( ); it++ ) {
- cgn = (*it)->cngNodeTo;
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--checkSOS 2: ";
- printCnGNode(cgn,Log::out());Log::out() << std::endl;
+ for (it1 = node->outEdges->begin( ); it1 != node->outEdges->end( ); it1++ ) {
+ node_fld = (*it1)->cngNodeTo;
+ if ((*it1)->edgeType != ET_FIELD) {
+ continue;
}
-#endif
- if (getEscState(cgn) < getEscState(node)) {
- if (getEscState(cgn)==GLOBAL_ESCAPE) {
- gle = true;
- break;
+ if (node_fld->outEdges==NULL) {
+ continue;
+ }
+ arge = false;
+ calle = false;
+ gle = false;
+ no_mod = false;
+ nt = node_fld;
+ n_inst = node_fld->nInst;
+ for (it = node_fld->outEdges->begin( ); it != node_fld->outEdges->end( ); it++ ) {
+ cgn = (*it)->cngNodeTo;
+#ifdef _DEBUG
+ if (_setState) {
+ Log::out() <<"--checkSOS 2: ";
+ printCnGNode(cgn,Log::out());Log::out() << std::endl;
+ }
+#endif
+ if (getEscState(cgn) < getEscState(node_fld)) {
+ if (getEscState(cgn)==GLOBAL_ESCAPE) {
+ gle = true;
+ break;
+ }
+ if (getEscState(cgn)==ARG_ESCAPE) {
+ arge = true;
+ continue;
+ }
}
- if (getEscState(cgn)==ARG_ESCAPE) {
- arge = true;
+ if (getOutEscaped(node_fld) == 0 && getOutEscaped(cgn) != 0) {
+ calle = true;
continue;
}
+ no_mod = true;
}
- if (getOutEscaped(node) == 0 && getOutEscaped(cgn) != 0) {
- calle = true;
- continue;
- }
- no_mod = true;
- }
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--checkSOS 2: " << no_mod << " " << gle << " " << calle << " " << arge
- << std::endl;
- }
+ if (_setState) {
+ Log::out() <<"--checkSOS 2: " << no_mod << " " << gle << " " << calle << " " << arge
+ << std::endl;
+ }
#endif
-
- if (gle || calle || arge) {
- if (node->nodeType==NT_ARRELEM) {
- if (n_inst->getOpcode() == Op_AddScaledIndex) {
- n_inst = n_inst->getSrc(0)->getInst();
- nt = findCnGNode_op(n_inst->getSrc(0)->getId());
+ if (gle || calle || arge) {
+ if (node_fld->nodeType==NT_ARRELEM) {
+ if (n_inst->getOpcode() == Op_AddScaledIndex) {
+ n_inst = n_inst->getSrc(0)->getInst();
+ nt = findCnGNode_op(n_inst->getSrc(0)->getId());
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--checkSOS 3: "; printCnGNode(nt,Log::out()); Log::out() << std::endl;
- }
+ if (_setState) {
+ Log::out() <<"--checkSOS 3: "; printCnGNode(nt,Log::out()); Log::out() << std::endl;
+ }
#endif
- if (nt->lNode != NULL) {
- nt = nt->lNode;
+ if (nt->lNode != NULL) {
+ nt = nt->lNode;
+ }
}
}
- }
#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--checkSOS 4: found ";
- printCnGNode(nt,Log::out());Log::out() << std::endl;
- }
+ if (_setState) {
+ Log::out() <<"--checkSOS 4: found ";
+ printCnGNode(nt,Log::out());Log::out() << std::endl;
+ }
#endif
- if (gle) {
- initNodeType = NT_STFLD;
- } else {
- if (calle) {
- initNodeType = NT_DEFARG;
+ if (gle) {
+ initNodeType = NT_STFLD;
} else {
- initNodeType = NT_ACTARG;
+ if (calle) {
+ initNodeType = NT_DEFARG;
+ } else {
+ initNodeType = NT_ACTARG;
+ }
}
- }
- for (it = nt->outEdges->begin( ); it != nt->outEdges->end( ); it++ ) {
- cgn1 = (*it)->cngNodeTo;
- if (gle || calle) {
- scanCnGNodeRefsGE((*it)->cngNodeTo,false);
- } else {
- curMDNode = 0;
- scanCnGNodeRefsAE((*it)->cngNodeTo,false);
+ if (node_fld->nodeType==NT_INSTFLD) { // set new state beginning with instance field
+ if (gle || calle) {
+ scanCnGNodeRefsGE(node_fld,false);
+ } else {
+ curMDNode = 0;
+ scanCnGNodeRefsAE(node_fld,false);
+ }
+ } else { // set new state beginning with array elements
+ for (it = nt->outEdges->begin( ); it != nt->outEdges->end( ); it++ ) {
+ cgn1 = (*it)->cngNodeTo;
+ if (cgn1->nodeType != NT_ARRELEM)
+ continue;
+ if (gle || calle) {
+ if (isStateNeedGEFix(getFullState(cgn1),cgn1->nodeType))
+ scanCnGNodeRefsGE(cgn1,false);
+ } else {
+ curMDNode = 0;
+ if (getEscState(cgn1) > ARG_ESCAPE)
+ scanCnGNodeRefsAE((*it)->cngNodeTo,false);
+ }
+ }
}
}
}
- if (!no_mod && gle && !calle && !arge) {
-#ifdef _DEBUG
- if (_setState) {
- Log::out() <<"--checkSOS 5: return " << std::endl;
- }
-#endif
- return;
- }
- scannedSucNodes->push_back(node->cngNodeId);
- if (_setState) {
- Log::out() <<"--checkSOS 6: added " << node->cngNodeId << std::endl;
- }
- for (it = node->outEdges->begin( ); it != node->outEdges->end( ); it++ ) {
- cgn = (*it)->cngNodeTo;
-
- checkSubobjectStates(cgn);
- }
} // checkSubobjectStates(CnGNode* node)
@@ -2450,15 +2425,19 @@
minfo->paramInfos=prminfos;
minfo->retValueState=0;
if (mdesc->getReturnType()->isReference()) {
- uint32 escstate = 3, bitstate = 0;
+ uint32 escstate = 0;
for (it = cngNodes->begin( ); it != cngNodes->end( ); it++) {
if ((*it)->nodeType==NT_EXITVAL) {
- bitstate = bitstate|getOutEscaped(*it);
- if (escstate > getEscState(*it))
- escstate=getEscState(*it);
+ if (isGlobalState(getFullState((*it)->outEdges->front()->cngNodeTo))) {
+ escstate = GLOBAL_ESCAPE;
+ break;
+ }
}
- }
- minfo->retValueState=escstate|bitstate;
+ }
+ if (escstate == 0) {
+ escstate = OUT_ESCAPED|NO_ESCAPE;
+ }
+ minfo->retValueState=escstate;
}
bool pmt = checkMonitorsOnThis();
minfo->mon_on_this = pmt;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h?view=diff&rev=545149&r1=545148&r2=545149
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h Thu Jun 7 04:47:07 2007
@@ -638,7 +638,15 @@
return true;
return false;
}
-
+ bool isStateNeedGEFix(uint32 state, uint32 nType) {
+ if ((state&ESC_MASK)==GLOBAL_ESCAPE)
+ return false;
+ if ((state&OUT_ESCAPED)!=0 && initNodeType != NT_STFLD)
+ return false;
+ if ((state&OUT_ESCAPED)!=0 && initNodeType == NT_DEFARG && nType != NT_DEFARG)
+ return false;
+ return true;
+ }
// Monitors elimination optimization