You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by eg...@apache.org on 2008/02/02 20:26:45 UTC
svn commit: r617865 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src:
main/PMF.cpp optimizer/escanalyzer.cpp optimizer/escanalyzer.h
Author: egor
Date: Sat Feb 2 11:26:43 2008
New Revision: 617865
URL: http://svn.apache.org/viewvc?rev=617865&view=rev
Log:
applying HARMONY-4901 [drlvm][jit] escape analysis fails with logging
patches:
escape.patch
escape-logging-more-enhancement.txt
test passed on Linux/x86, woo hoo
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp
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/main/PMF.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp?rev=617865&r1=617864&r2=617865&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/main/PMF.cpp Sat Feb 2 11:26:43 2008
@@ -706,8 +706,6 @@
LogStreams::~LogStreams ()
{
- assert(depth == 0);
-
LogStream* lsp;
for (size_t sx = 0; sx != nbos; ++sx)
if ((lsp = streams[sx])->enabled)
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?rev=617865&r1=617864&r2=617865&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.cpp Sat Feb 2 11:26:43 2008
@@ -1418,7 +1418,6 @@
} else {
Log::out() << " isNative: true" << std::endl;
}
-
}
if (verboseLog) {
Log::out() <<"--setSt 1: nodeId " <<(*it)->cngNodeId<<" opId "<<(*it)->opndId <<" state ";
@@ -2218,14 +2217,8 @@
Inst* inst = ((Opnd*)(*it)->refObj)->getInst();
inst->print(os);
if (inst->getOpcode()==Op_IndirectMemoryCall) {
- MethodDesc* md;
- if (inst->getSrc(0)->getInst()->getOpcode()== Op_LdVar) {
- md = inst->getSrc(0)->getType()->asMethodPtrType()->getMethodDesc();
- } else {
- md = inst->getSrc(0)->getInst()->asMethodInst()->getMethodDesc();
- }
- os << std::endl; os << " ";
- md->printFullName(os);
+ os << std::endl; os << " ";
+ printCallMethodName(inst, os);
}
}
if ((*it)->nodeType & NT_ACTARG) { //node of actual method parameter
@@ -2234,7 +2227,7 @@
}
if ((*it)->nodeType & NT_STFLD) { //field node
Inst* inst = (Inst*)(*it)->refObj;
- inst->print(Log::out());
+ inst->print(os);
}
os << std::endl;
}
@@ -2405,14 +2398,9 @@
if (cgn->nodeType==NT_RETVAL) {
inst = cgn->nInst;
if (inst->getOpcode()==Op_IndirectMemoryCall) {
- MethodDesc* md;
- if (inst->getSrc(0)->getInst()->getOpcode()== Op_LdVar) {
- md = inst->getSrc(0)->getType()->asMethodPtrType()->getMethodDesc();
- } else {
- md = inst->getSrc(0)->getInst()->asMethodInst()->getMethodDesc();
- }
- os << text << " ";
- md->printFullName(os); os << std::endl;
+ os << text << " ";
+ printCallMethodName(inst, os);
+ os << std::endl;
}
}
if (cgn->nodeType==NT_LDOBJ && getEscState(cgn)!=GLOBAL_ESCAPE) {
@@ -2424,6 +2412,32 @@
void
+EscAnalyzer::printCallMethodName(Inst* inst, ::std::ostream& os) {
+ assert(inst);
+ Opnd* zeroOpnd = inst->getSrc(0);
+ Inst* srcInst = zeroOpnd->getInst();
+ if (srcInst->getOpcode()== Op_LdVar) {
+ MethodDesc* md = zeroOpnd->getType()->asMethodPtrType()->getMethodDesc();
+ md->printFullName(os);
+ } else if (inst->isMethod()) {
+ MethodDesc* md = inst->asMethodInst()->getMethodDesc();
+ md->printFullName(os);
+ } else if (srcInst->isMethod()) {
+ // Op_TauLdVirtFunAddrSlot
+ MethodDesc* md = srcInst->asMethodInst()->getMethodDesc();
+ md->printFullName(os);
+ } else if (srcInst->isVMHelperCallInst()) {
+ // A dst operand from VMHelperCallInst might also be srcInst for
+ // IndirectMemoryCall (for example, lazy resolution helper).
+ // There is no MethodDesc to print for such calls.
+ os << "some vmhelper";
+ } else {
+ assert(0);
+ }
+ os << std::endl;
+} // printCallMethodName(Inst* inst, std::string text,::std::ostream& os)
+
+void
EscAnalyzer::lObjectHistory(Inst* inst,std::string text,::std::ostream& os) {
Inst* inst1;
uint32 nsrc=inst->getNumSrcOperands();
@@ -2444,13 +2458,9 @@
}
}
if (inst->getOpcode()==Op_IndirectMemoryCall) {
- MethodDesc* md;
- if (inst->getSrc(0)->getInst()->getOpcode()== Op_LdVar) {
- md = inst->getSrc(0)->getType()->asMethodPtrType()->getMethodDesc();
- } else {
- md = inst->getSrc(0)->getInst()->asMethodInst()->getMethodDesc();
- }
- os << text << " "; md->printFullName(os); os << std::endl;
+ os << text << " ";
+ printCallMethodName(inst, os);
+ os << std::endl;
}
return;
}
@@ -2578,15 +2588,9 @@
}
}
if (inst->getOpcode()==Op_IndirectMemoryCall) {
- MethodDesc* md;
- if (inst->getSrc(0)->getInst()->getOpcode()== Op_LdVar) {
- md = inst->getSrc(0)->getType()->asMethodPtrType()->getMethodDesc();
- } else {
- md = inst->getSrc(0)->getInst()->asMethodInst()->getMethodDesc();
- }
if (verboseLog) {
Log::out() << text << " ";
- md->printFullName(Log::out() );
+ printCallMethodName(inst, Log::out());
Log::out() << std::endl;
}
}
@@ -3980,8 +3984,6 @@
EscAnalyzer::doLOScalarReplacement(ObjIds* loids) {
ObjIds::iterator lo_it;
CnGNode* onode;
- Inst* inst;
- Inst* st_inst;
Insts::iterator it3;
OpndManager& _opndManager = irManager.getOpndManager();
InstFactory& _instFactory = irManager.getInstFactory();
@@ -3991,7 +3993,7 @@
if (loids == NULL)
return;
- if (loids->size() == 0)
+ if (loids->size() == 0)
return;
for (lo_it=loids->begin(); lo_it!=loids->end(); lo_it++) {
onode = findCnGNode_op(*lo_it);
@@ -4038,62 +4040,43 @@
if (sco->ls_insts->size()==0) {
continue;
}
- bool do_fld_sc = false;
- for (it3 = sco->ls_insts->begin(); it3 != sco->ls_insts->end( ); it3++ ) {
- if ((*it3)->getOpcode() == Op_TauLdInd) {
- do_fld_sc = true;
- break;
- }
+ Type* fl_type = NULL;
+ Type* fl_type1 = NULL;
+ Inst* ii = sco->ls_insts->front();
+ if (ii->getOpcode()==Op_TauStInd) {
+ fl_type1 = ii->getSrc(1)->getType()->asPtrType()->getPointedToType();
+ fl_type = ii->getSrc(0)->getType();
+ } else {
+ fl_type1 = ii->getSrc(0)->getType()->asPtrType()->getPointedToType();
+ fl_type = ii->getDst()->getType();
}
- if (do_fld_sc) {
- Type* fl_type = NULL;
- Type* fl_type1 = NULL;
- Inst* ii = sco->ls_insts->front();
- if (ii->getOpcode()==Op_TauStInd) {
- fl_type1 = ii->getSrc(1)->getType()->asPtrType()->getPointedToType();
- fl_type = ii->getSrc(0)->getType();
- } else {
- fl_type1 = ii->getSrc(0)->getType()->asPtrType()->getPointedToType();
- fl_type = ii->getDst()->getType();
- }
- VarOpnd* fl_var_opnd = _opndManager.createVarOpnd(fl_type, false);
- SsaTmpOpnd* fl_init_opnd = _opndManager.createSsaTmpOpnd(fl_type);
- Inst* ld_init_val_inst = NULL;
- sco->fldVarOpnd = fl_var_opnd;
+ VarOpnd* fl_var_opnd = _opndManager.createVarOpnd(fl_type, false);
+ SsaTmpOpnd* fl_init_opnd = _opndManager.createSsaTmpOpnd(fl_type);
+ Inst* ld_init_val_inst = NULL;
+ sco->fldVarOpnd = fl_var_opnd;
- if (verboseLog) {
- os_sc<<" PointedType "; fl_type1->print(os_sc); os_sc <<std::endl;
- os_sc<<" OperandType "; fl_type->print(os_sc); os_sc <<std::endl;
- }
- if (fl_type->isReference()) {
- ld_init_val_inst = _instFactory.makeLdNull(fl_init_opnd);
- } else {
- ld_init_val_inst = _instFactory.makeLdConst(fl_init_opnd, 0);
- }
+ if (verboseLog) {
+ os_sc<<" PointedType "; fl_type1->print(os_sc); os_sc <<std::endl;
+ os_sc<<" OperandType "; fl_type->print(os_sc); os_sc <<std::endl;
+ }
+ if (fl_type->isReference()) {
+ ld_init_val_inst = _instFactory.makeLdNull(fl_init_opnd);
+ } else {
+ ld_init_val_inst = _instFactory.makeLdConst(fl_init_opnd, 0);
+ }
- scalarizeOFldUsage(sco);
- if (verboseLog) {
- os_sc << "++++ old newobj added fld_var: before" << std::endl;
- FlowGraph::print(os_sc,onode->nInst->getNode());
- os_sc << "++++ old newobj: before end" << std::endl;
- }
- ld_init_val_inst->insertBefore(onode->nInst);
- _instFactory.makeStVar(fl_var_opnd,fl_init_opnd)->insertBefore(onode->nInst);
- if (verboseLog) {
- os_sc << "++++ old newobj added fld_var: after" << std::endl;
- FlowGraph::print(os_sc,onode->nInst->getNode());
- os_sc << "++++ old newobj: after end" << std::endl;
- }
- } else { // there was no ldind instructions
- for (it3 = sco->ls_insts->begin(); it3 != sco->ls_insts->end( ); it3++ ) {
- st_inst = *it3;
- removeInst(st_inst);
- removeInst(inst=st_inst->getSrc(1)->getInst());
- removeInst(inst=inst->getSrc(0)->getInst());
- if (inst->getOpcode() == Op_LdArrayBaseAddr) {
- removeInst(inst->getSrc(0)->getInst());
- }
- }
+ scalarizeOFldUsage(sco);
+ if (verboseLog) {
+ os_sc << "++++ old newobj added fld_var: before" << std::endl;
+ FlowGraph::print(os_sc,onode->nInst->getNode());
+ os_sc << "++++ old newobj: before end" << std::endl;
+ }
+ ld_init_val_inst->insertBefore(onode->nInst);
+ _instFactory.makeStVar(fl_var_opnd,fl_init_opnd)->insertBefore(onode->nInst);
+ if (verboseLog) {
+ os_sc << "++++ old newobj added fld_var: after" << std::endl;
+ FlowGraph::print(os_sc,onode->nInst->getNode());
+ os_sc << "++++ old newobj: after end" << std::endl;
}
}
}
@@ -4102,14 +4085,14 @@
if (verboseLog) {
os_sc << "++++ old newobj removed: before" << std::endl;
FlowGraph::print(os_sc,no_node);
- os_sc << "++++ old newobj: after end" << std::endl;
- }
+ os_sc << "++++ old newobj: before end" << std::endl;
+ }
removeInst(onode->nInst);
if (verboseLog) {
os_sc << "++++ old newobj removed: after" << std::endl;
FlowGraph::print(os_sc,no_node);
os_sc << "++++ old newobj: after end" << std::endl;
- }
+ }
}
}
} // doLOScalarReplacement(ObjIds* loids)
@@ -4134,7 +4117,7 @@
if (loids == NULL)
return;
- if (loids->size() == 0)
+ if (loids->size() == 0)
return;
for (lo_it=loids->begin(); lo_it!=loids->end(); lo_it++) {
onode = findCnGNode_op(*lo_it);
@@ -4729,12 +4712,7 @@
os_sc << " "; FlowGraph::printLabel(os_sc,inst->getNode());
os_sc << " "; inst->print(os_sc); os_sc << std::endl;
if (opcode == Op_IndirectMemoryCall || opcode == Op_DirectCall) {
- MethodDesc* md = getMD(inst);
- if (md->isNative())
- os_sc << " native " << std::endl;
- if (opcode==Op_IndirectMemoryCall) {
- os_sc << " ";md->printFullName(os_sc); os_sc << std::endl;
- }
+ printCallMethodName(inst, os_sc);
}
}
if (opcode == Op_IndirectMemoryCall || opcode == Op_DirectCall) {
@@ -4803,12 +4781,7 @@
os_sc << " "; FlowGraph::printLabel(os_sc,inst->getNode());
os_sc << " "; inst->print(os_sc); os_sc << std::endl;
if (opcode == Op_IndirectMemoryCall || opcode == Op_DirectCall) {
- MethodDesc* md = getMD(inst);
- if (md->isNative())
- os_sc << " native " << std::endl;
- if (opcode==Op_IndirectMemoryCall) {
- os_sc << " ";md->printFullName(os_sc); os_sc << std::endl;
- }
+ printCallMethodName(inst, os_sc);
}
}
if (opcode != Op_LdFieldAddr && opcode != Op_LdArrayBaseAddr &&
@@ -4970,8 +4943,7 @@
os_sc << std::endl << " ";
ii->print(os_sc); os_sc << std::endl;
if (ii->getOpcode()==Op_IndirectMemoryCall) {
- MethodDesc* md = getMD(ii);
- os_sc<<" ";md->printFullName(os_sc);os_sc << std::endl;
+ printCallMethodName(ii, os_sc);
}
}
}
@@ -5444,7 +5416,7 @@
fg.addEdge(node_after1,node_after);
}
}
-
+
node_obj1=fg.splitNodeAtInstruction(newobj,splitAfter,false, _instFactory.makeLabel());
fg.addEdge(node_obj,dispatchNode);
@@ -5495,23 +5467,6 @@
}
} // removeInst(Inst* reminst)
-
-MethodDesc*
-EscAnalyzer::getMD(Inst* inst) {
- MethodDesc* md;
- if (inst->getOpcode()==Op_DirectCall)
- return inst->asMethodCallInst()->getMethodDesc();
- if (inst->getOpcode()!=Op_IndirectMemoryCall)
- return NULL;
- if (inst->getSrc(0)->getInst()->getOpcode()== Op_LdVar) {
- md = inst->getSrc(0)->getType()->asMethodPtrType()->getMethodDesc();
- } else {
- md = inst->getSrc(0)->getInst()->asMethodInst()->getMethodDesc();
- }
- return md;
-}
-
-
void
EscAnalyzer::fixMethodEndInsts(uint32 ob_id) {
Insts::iterator itmei;
@@ -5521,7 +5476,7 @@
Inst* mei = *itmei;
uint32 i = 0;
uint32 nsrc = mei->getNumSrcOperands();
-
+
if (nsrc == 0)
continue;
Opnd* o = mei->getSrc(i);
@@ -5612,7 +5567,7 @@
break;
}
}
-
+
if (inst->getOpcode()==Op_DirectCall || inst->getOpcode()==Op_IndirectMemoryCall) {
return false;
}
@@ -5671,7 +5626,7 @@
|| (strcmp(otn,"java/lang/Long$valueOfCache") == 0)
|| (strcmp(otn,"java/lang/Character$valueOfCache") == 0) ) {
return true;
- }
+ }
return false;
}
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?rev=617865&r1=617864&r2=617865&view=diff
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/escanalyzer.h Sat Feb 2 11:26:43 2008
@@ -461,6 +461,13 @@
void printCnGNode(CnGNode* cgn,::std::ostream& os);
/**
+* Outputs method name information into the specified log.
+* @param inst - call instruction,
+* @param os - log stream
+*/
+void printCallMethodName(Inst* inst, ::std::ostream& os);
+
+/**
* Creates string representing CnG node type.
* @param cgn - connection graph node.
* @return srting representing CnG node type.
@@ -927,14 +934,6 @@
* @param reminst - removed instruction.
*/
void removeInst(Inst* reminst);
-
-/**
- * Returns MethodDesc* for Op_IndirectMemoryCall and Op_DirectCall instructions.
- * @param inst - call instruction.
- * @return MethodDesc for <code>Op_IndirectMemoryCall</code> and <code>Op_DirectCall</code>;
- * <code>NULL<code> otherwise.
- */
- MethodDesc* getMD(Inst* inst);
/**
* Replaces first source operand of Op_MethodEnd instruction by NULL