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/02/02 12:25:03 UTC
svn commit: r502579 - in /harmony/enhanced/drlvm/trunk/vm: em/src/
include/open/ jitrino/config/em64t/ jitrino/config/ia32/
jitrino/src/dynopt/ jitrino/src/optimizer/ jitrino/src/vm/
jitrino/src/vm/drl/
Author: varlax
Date: Fri Feb 2 03:25:01 2007
New Revision: 502579
URL: http://svn.apache.org/viewvc?view=rev&rev=502579
Log:
Applied HARMONY-3052 [drlvm][jit][opt] unguard configuration and value profiler improvements
Tested on SUSE10@x86, SUSE9@x86_64
Modified:
harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp
harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.cpp
harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.h
harmony/enhanced/drlvm/trunk/vm/include/open/em_profile_access.h
harmony/enhanced/drlvm/trunk/vm/jitrino/config/em64t/server.emconf
harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf
harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/EMInterface.h
harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp
harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.h
Modified: harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/em/src/DrlEMImpl.cpp Fri Feb 2 03:25:01 2007
@@ -148,6 +148,7 @@
profileAccessInterface.value_profiler_create_profile = value_profiler_create_profile;
profileAccessInterface.value_profiler_add_value = value_profiler_add_value;
profileAccessInterface.value_profiler_get_top_value = value_profiler_get_top_value;
+ profileAccessInterface.value_profiler_dump_values = value_profiler_dump_values;
return;
}
Modified: harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.cpp?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.cpp Fri Feb 2 03:25:01 2007
@@ -64,6 +64,7 @@
}
return (-1);
}
+
void ValueProfileCollector::insert_into_tnv_table (struct Simple_TNV_Table* TNV_table, struct Simple_TNV_Table* TNV_clear_part, POINTER_SIZE_INT value_to_insert, uint32 times_met)
{
uint32 insert_index, temp_min_index;
@@ -150,59 +151,20 @@
return profile;
}
-
-
-void ValueProfileCollector::addNewValue(Method_Profile_Handle mph, uint32 instructionKey, POINTER_SIZE_INT valueToAdd)
-{
- POINTER_SIZE_INT curr_value = valueToAdd;
- ValueMethodProfile* vmp = ((ValueMethodProfile*)mph);
- vmp->lockProfile();
- VPInstructionProfileData* _temp_vp = vmp->ValueMap[instructionKey];
- POINTER_SIZE_INT* last_value = &(_temp_vp->last_value);
- uint32* profile_tick = &(_temp_vp->profile_tick);
- uint32* num_times_profiled = &(_temp_vp->num_times_profiled);
- struct Simple_TNV_Table * TNV_clear_part = _temp_vp->TNV_clear_part;
- struct Simple_TNV_Table * TNV_steady_part = _temp_vp->TNV_Table;
- if ( TNV_algo_type == TNV_DIVIDED){
- if (*profile_tick == clear_interval){
- *profile_tick = 0;
- simple_tnv_clear(TNV_clear_part);
- }
- (*profile_tick)++;
- }
- if (curr_value == *last_value){
- (*num_times_profiled)++;
- }
- else {
- *num_times_profiled = 1;
- insert_into_tnv_table (TNV_steady_part, TNV_clear_part, valueToAdd, *num_times_profiled);
- *last_value = curr_value;
- }
- vmp->unlockProfile();
-}
-
POINTER_SIZE_INT ValueProfileCollector::find_max(Simple_TNV_Table *TNV_where)
{
POINTER_SIZE_INT max_value = 0;
uint32 temp_index, temp_max_frequency = 0;
- for (temp_index = 0; temp_index < TNV_steady_size; temp_index++)
- if (TNV_where->frequency > temp_max_frequency){
- temp_max_frequency = TNV_where->frequency;
- max_value = TNV_where->value;
+ for (temp_index = 0; temp_index < TNV_steady_size; temp_index++) {
+ Simple_TNV_Table *TNV_current = &(TNV_where[temp_index]);
+ if (TNV_current->frequency > temp_max_frequency){
+ temp_max_frequency = TNV_current->frequency;
+ max_value = TNV_current->value;
}
+ }
return (max_value);
}
-POINTER_SIZE_INT ValueProfileCollector::getResult(Method_Profile_Handle mph, uint32 instructionKey)
-{
- ValueMethodProfile* vmp = ((ValueMethodProfile*)mph);
- vmp->lockProfile();
- VPInstructionProfileData* _temp_vp = vmp->ValueMap[instructionKey];
- POINTER_SIZE_INT result = (_temp_vp == NULL) ? 0 : find_max(_temp_vp->TNV_Table);
- vmp->unlockProfile();
- return result;
-}
-
ValueProfileCollector::ValueProfileCollector(EM_PC_Interface* em, const std::string& name, JIT_Handle genJit,
uint32 _TNV_steady_size, uint32 _TNV_clear_size,
uint32 _clear_interval, algotypes _TNV_algo_type)
@@ -243,6 +205,108 @@
hymutex_destroy(lock);
}
+void ValueMethodProfile::addNewValue(uint32 instructionKey, POINTER_SIZE_INT valueToAdd)
+{
+ POINTER_SIZE_INT curr_value = valueToAdd;
+ lockProfile();
+ VPInstructionProfileData* _temp_vp = ValueMap[instructionKey];
+ POINTER_SIZE_INT* last_value = &(_temp_vp->last_value);
+ uint32* profile_tick = &(_temp_vp->profile_tick);
+ uint32* num_times_profiled = &(_temp_vp->num_times_profiled);
+ struct Simple_TNV_Table* TNV_clear_part = _temp_vp->TNV_clear_part;
+ struct Simple_TNV_Table* TNV_steady_part = _temp_vp->TNV_Table;
+ if ( getVPC()->TNV_algo_type == ValueProfileCollector::TNV_DIVIDED){
+ if (*profile_tick == getVPC()->clear_interval){
+ *profile_tick = 0;
+ getVPC()->simple_tnv_clear(TNV_clear_part);
+ }
+ (*profile_tick)++;
+ }
+ if (curr_value == *last_value){
+ (*num_times_profiled)++;
+ }
+ else {
+ flushInstProfile(_temp_vp);
+ *num_times_profiled = 1;
+ getVPC()->insert_into_tnv_table (TNV_steady_part, TNV_clear_part, valueToAdd, *num_times_profiled);
+ *last_value = curr_value;
+ }
+ unlockProfile();
+}
+
+
+POINTER_SIZE_INT ValueMethodProfile::getResult(uint32 instructionKey)
+{
+ lockProfile();
+ VPInstructionProfileData* _temp_vp = ValueMap[instructionKey];
+ flushInstProfile(_temp_vp);
+ POINTER_SIZE_INT result = (_temp_vp == NULL) ? 0 : getVPC()->find_max(_temp_vp->TNV_Table);
+ unlockProfile();
+ return result;
+}
+
+void ValueMethodProfile::flushInstProfile(VPInstructionProfileData* instProfile)
+{
+ POINTER_SIZE_INT last_value = instProfile->last_value;
+ uint32* num_times_profiled = &(instProfile->num_times_profiled);
+ struct Simple_TNV_Table* TNV_clear_part = instProfile->TNV_clear_part;
+ struct Simple_TNV_Table* TNV_steady_part = instProfile->TNV_Table;
+ getVPC()->insert_into_tnv_table (TNV_steady_part, TNV_clear_part, last_value, *num_times_profiled);
+ *num_times_profiled = 0;
+}
+
+void ValueMethodProfile::dumpValues(std::ostream& os)
+{
+ std::map<uint32, VPInstructionProfileData*>::const_iterator mapIter;
+ assert(pc->type == EM_PCTYPE_VALUE);
+ lockProfile();
+ os << "===== Value profile dump, " << ValueMap.size() << " element(s) ===" << std::endl;
+ for (mapIter = ValueMap.begin(); mapIter != ValueMap.end(); mapIter++) {
+ os << "=== Instruction key: " << mapIter->first;
+ VPInstructionProfileData* _temp_vp = mapIter->second;
+ flushInstProfile(_temp_vp);
+ os << ", num_times_profiled: " << _temp_vp->num_times_profiled << ", profile_tick: " << _temp_vp->profile_tick << std::endl;
+ struct Simple_TNV_Table * TNV_steady_part = _temp_vp->TNV_Table;
+ if (TNV_steady_part != NULL) {
+ uint32 size = ((ValueProfileCollector*)pc)->TNV_steady_size;
+ os << "= TNV_steady_part, size = " << size << std::endl;
+ for (uint32 i = 0; i < size; i++) {
+ os << "== Frequency: " << TNV_steady_part[i].frequency << " = Value: ";
+ POINTER_SIZE_INT value = TNV_steady_part[i].value;
+ if (value != 0) {
+ os << class_get_name(vtable_get_class((VTable_Handle)value));
+ } else {
+ os << "NULL";
+ }
+ os << " ==" << std::endl;
+ }
+ }
+ struct Simple_TNV_Table * TNV_clear_part = _temp_vp->TNV_clear_part;
+ if (TNV_clear_part != NULL) {
+ uint32 size = ((ValueProfileCollector*)pc)->TNV_clear_size;
+ os << "= TNV_clear_part, size = " << size << std::endl;
+ for (uint32 i = 0; i < size; i++) {
+ os << "== " << TNV_clear_part[i].frequency << " = Value: ";
+ POINTER_SIZE_INT value = TNV_clear_part[i].value;
+ if (value != 0) {
+ os << class_get_name(vtable_get_class((VTable_Handle)value));
+ } else {
+ os << "NULL";
+ }
+ os << " ==" << std::endl;
+ }
+ }
+ }
+ unlockProfile();
+ os << "====== End of dump ======================" << std::endl;
+}
+
+ValueProfileCollector* ValueMethodProfile::getVPC() const {
+ assert(pc->type == EM_PCTYPE_VALUE);
+ return ((ValueProfileCollector*)pc);
+}
+
+
MethodProfile* ValueProfileCollector::getMethodProfile(Method_Handle mh) const
{
ValueProfilesMap::const_iterator it = profilesByMethod.find(mh);
@@ -260,16 +324,27 @@
MethodProfile* mp = (MethodProfile*)mph;
assert(mp->pc->type == EM_PCTYPE_VALUE);
ValueMethodProfile* vmp = (ValueMethodProfile*)mp;
- return ((ValueProfileCollector*)(vmp->pc))->getResult(mph, instructionKey);
+ return vmp->getResult(instructionKey);
}
+
void value_profiler_add_value (Method_Profile_Handle mph, uint32 instructionKey, POINTER_SIZE_INT valueToAdd)
{
assert(mph != NULL);
MethodProfile* mp = (MethodProfile*)mph;
assert(mp->pc->type == EM_PCTYPE_VALUE);
ValueMethodProfile* vmp = (ValueMethodProfile*)mp;
- return ((ValueProfileCollector*)(vmp->pc))->addNewValue(mph, instructionKey, valueToAdd);
+ return vmp->addNewValue(instructionKey, valueToAdd);
}
+
+void value_profiler_dump_values(Method_Profile_Handle mph, std::ostream& os)
+{
+ assert(mph != NULL);
+ MethodProfile* mp = (MethodProfile*)mph;
+ assert(mp->pc->type == EM_PCTYPE_VALUE);
+ ValueMethodProfile* vmp = (ValueMethodProfile*)mp;
+ vmp->dumpValues(os);
+}
+
Method_Profile_Handle value_profiler_create_profile(PC_Handle pch, Method_Handle mh, uint32 numkeys, uint32 keys[])
{
assert(pch!=NULL);
Modified: harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.h?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/em/src/NValueProfileCollector.h Fri Feb 2 03:25:01 2007
@@ -49,23 +49,22 @@
uint32 TNV_clear_size;
uint32 clear_interval;
algotypes TNV_algo_type;
- struct Simple_TNV_Table * TNV_clear_part;
- struct Simple_TNV_Table * TNV_steady_part;
public:
ValueProfileCollector(EM_PC_Interface* em, const std::string& name, JIT_Handle genJit,
uint32 _TNV_steady_size, uint32 _TNV_clear_size,
uint32 _clear_interval, algotypes _TNV_algo_type);
virtual TbsEMClient* getTbsEmClient() const {return (NULL);}
- virtual ~ValueProfileCollector(); MethodProfile* getMethodProfile(Method_Handle mh) const ;
+ virtual ~ValueProfileCollector();
+ MethodProfile* getMethodProfile(Method_Handle mh) const ;
ValueMethodProfile* createProfile(Method_Handle mh, uint32 numkeys, uint32 keys[]);
- POINTER_SIZE_INT getResult(Method_Profile_Handle mph, uint32 instructionKey);
- void addNewValue(Method_Profile_Handle mph, uint32 instructionKey, POINTER_SIZE_INT valueToAdd);
-private:
+
int32 search_in_tnv_table (struct Simple_TNV_Table * TNV_where, POINTER_SIZE_INT value_to_search, uint32 number_of_objects);
int32 min_in_tnv (struct Simple_TNV_Table * TNV_where, uint32 number_of_objects);
void insert_into_tnv_table (struct Simple_TNV_Table* TNV_table, struct Simple_TNV_Table* TNV_clear_part, POINTER_SIZE_INT value_to_insert, uint32 times_met);
POINTER_SIZE_INT find_max(struct Simple_TNV_Table* TNV_where);
void simple_tnv_clear (struct Simple_TNV_Table* TNV_where);
+
+private:
std::string catName;
bool loggingEnabled;
typedef std::map<Method_Handle, ValueMethodProfile*> ValueProfilesMap;
@@ -94,14 +93,20 @@
~ValueMethodProfile();
void lockProfile() {hymutex_lock(lock);}
void unlockProfile() {hymutex_unlock(lock);}
+ void dumpValues(std::ostream& os);
+ void addNewValue(uint32 instructionKey, POINTER_SIZE_INT valueToAdd);
+ POINTER_SIZE_INT getResult(uint32 instructionKey);
private:
+ // unsynchronized method - must be called from synchronized ones
+ void flushInstProfile(VPInstructionProfileData* instProfile);
+ ValueProfileCollector* getVPC() const;
+
hymutex_t lock;
};
-Method_Profile_Handle value_profiler_create_profile(PC_Handle ph, Method_Handle mh, uint32 instructionKey, ValueProfileCollector::algotypes, uint32 steadySize, uint32 clearSize, uint32 clearInterval);
-
POINTER_SIZE_INT value_profiler_get_top_value (Method_Profile_Handle mph, uint32 instructionKey);
void value_profiler_add_value (Method_Profile_Handle mph, uint32 instructionKey, POINTER_SIZE_INT valueToAdd);
Method_Profile_Handle value_profiler_create_profile(PC_Handle pch, Method_Handle mh, uint32 numkeys, uint32 keys[]);
+void value_profiler_dump_values(Method_Profile_Handle mph, std::ostream& os);
#endif
Modified: harmony/enhanced/drlvm/trunk/vm/include/open/em_profile_access.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/include/open/em_profile_access.h?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/include/open/em_profile_access.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/include/open/em_profile_access.h Fri Feb 2 03:25:01 2007
@@ -20,6 +20,7 @@
#include "open/types.h"
#include "open/em.h"
+#include <iostream>
#ifdef __cplusplus
extern "C" {
@@ -246,7 +247,7 @@
*/
POINTER_SIZE_INT (*value_profiler_get_top_value) (Method_Profile_Handle mph, uint32 instructionKey);
-
+ void (*value_profiler_dump_values) (Method_Profile_Handle mph, std::ostream& os);
} EM_ProfileAccessInterface;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/config/em64t/server.emconf
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/config/em64t/server.emconf?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/config/em64t/server.emconf (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/config/em64t/server.emconf Fri Feb 2 03:25:01 2007
@@ -45,7 +45,8 @@
-XDjit.SD1_OPT.path=opt_init,translator,optimizer,hir2lir,codegen
--XDjit.SD1_OPT.path.optimizer=ssa,simplify,dce,uce,vp_instrument,edge_instrument,dessa,statprof,markglobals
+-XDjit.SD1_OPT.path.optimizer=ssa,simplify,dce,uce,vp_instrument,devirt_virtual,edge_instrument,dessa,statprof,markglobals
+-XDjit.SD1_OPT.path.devirt_virtual=devirt
-XDjit.SD1_OPT.path.codegen=lock_method,bbp,gcpoints,cafl,dce1,i8l-,early_prop-,itrace-,native,constraints,dce2,regalloc,spillgen,layout,copy,rce-,stack,break-,iprof-,emitter!,si_insts,gcmap,info,unlock_method
-XDjit.SD1_OPT.path.dce1=cg_dce
-XDjit.SD1_OPT.path.dce2=cg_dce
@@ -61,7 +62,7 @@
-XDjit.SD2_OPT.path=opt_init,translator,optimizer,hir2lir,codegen
--XDjit.SD2_OPT.path.optimizer=ssa,simplify,dce,uce,edge_annotate,devirt,inline,uce,purge,simplify,dce,uce,hvn,dce,uce,dessa,statprof,peel,ssa,hvn,simplify,dce,uce,lower,dce,uce,memopt,reassoc,dce,uce,hvn,dce,uce,abcd,dce,uce,gcm,dessa,statprof,markglobals
+-XDjit.SD2_OPT.path.optimizer=ssa,simplify,dce,uce,devirt_virtual,edge_annotate,unguard,devirt_intf,inline,uce,purge,simplify,dce,uce,hvn,dce,uce,dessa,statprof,peel,ssa,hvn,simplify,dce,uce,lower,dce,uce,memopt,reassoc,dce,uce,hvn,dce,uce,abcd,dce,uce,gcm,dessa,statprof,markglobals
-XDjit.SD2_OPT.path.codegen=lock_method,bbp,gcpoints,cafl,dce1,i8l-,early_prop-,itrace-,native,constraints,dce2,regalloc,spillgen,layout,copy,rce-,stack,break-,iprof-,emitter!,si_insts,gcmap,info,unlock_method
-XDjit.SD2_OPT.path.dce1=cg_dce
-XDjit.SD2_OPT.path.dce2=cg_dce
@@ -69,11 +70,22 @@
-XDjit.SD2_OPT.path.bp_regalloc1=bp_regalloc
-XDjit.SD2_OPT.path.bp_regalloc2=bp_regalloc
+#devirt configuration
+-XDjit.SD2_OPT.path.devirt_virtual=devirt
+-XDjit.SD2_OPT.path.devirt_intf=devirt
+-XDjit.SD2_OPT.arg.optimizer.devirt_intf.devirt_intf_calls=true
+-XDjit.SD2_OPT.arg.optimizer.devirt_intf.devirt_virtual_calls=false
+
#inliner configuration
-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.filter=-
--XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path=ssa,simplify,dce,uce,edge_annotate,devirt
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path=ssa,simplify,dce,uce,devirt_virtual,edge_annotate,unguard,devirt_intf
-XDjit.SD2_OPT.arg.optimizer.inline.pipeline=SD2_OPT_inliner_pipeline
-XDjit.SD2_OPT.arg.optimizer.inline.connect_early=false
+#devirt configuration for inliner pipeline
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path.devirt_virtual=devirt
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path.devirt_intf=devirt
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.arg.devirt_intf.devirt_intf_calls=true
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.arg.devirt_intf.devirt_virtual_calls=false
-XDjit.SD2_OPT.arg.codegen.dce1.early=yes
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/config/ia32/server.emconf Fri Feb 2 03:25:01 2007
@@ -45,7 +45,8 @@
-XDjit.SD1_OPT.path=opt_init,translator,optimizer,hir2lir,codegen
--XDjit.SD1_OPT.path.optimizer=ssa,simplify,dce,uce,vp_instrument,edge_instrument,dessa,statprof,markglobals
+-XDjit.SD1_OPT.path.optimizer=ssa,simplify,dce,uce,vp_instrument,devirt_virtual,edge_instrument,dessa,statprof,markglobals
+-XDjit.SD1_OPT.path.devirt_virtual=devirt
-XDjit.SD1_OPT.path.codegen=lock_method,bbp,btr,gcpoints,cafl,dce1,i8l,api_magic,early_prop,peephole,itrace-,native,constraints,dce2,regalloc,spillgen,layout,copy,rce+,stack,break-,iprof-,peephole,emitter!,si_insts,gcmap,info,unlock_method
-XDjit.SD1_OPT.path.dce1=cg_dce
-XDjit.SD1_OPT.path.dce2=cg_dce
@@ -59,9 +60,10 @@
-XDjit.SD1_OPT.arg.codegen.btr.insertCMOVs=no
-XDjit.SD1_OPT.arg.codegen.btr.removeConstCompare=yes
+
-XDjit.SD2_OPT.path=opt_init,translator,optimizer,hir2lir,codegen
--XDjit.SD2_OPT.path.optimizer=ssa,simplify,dce,uce,edge_annotate,devirt,inline,uce,purge,simplify,dce,uce,lazyexc,inline_helpers,purge,simplify,uce,dce,dessa,statprof,peel,ssa,hvn,simplify,dce,uce,lower,dce,uce,memopt,reassoc,dce,uce,hvn,dce,uce,abcd,dce,uce,gcm,dessa,statprof,markglobals
+-XDjit.SD2_OPT.path.optimizer=ssa,simplify,dce,uce,devirt_virtual,edge_annotate,unguard,devirt_intf,inline,uce,purge,simplify,dce,uce,lazyexc,inline_helpers,purge,simplify,uce,dce,dessa,statprof,peel,ssa,hvn,simplify,dce,uce,lower,dce,uce,memopt,reassoc,dce,uce,hvn,dce,uce,abcd,dce,uce,gcm,dessa,statprof,markglobals
-XDjit.SD2_OPT.path.codegen=lock_method,bbp,btr,gcpoints,cafl,dce1,i8l,api_magic,early_prop,peephole,itrace-,native,constraints,dce2,regalloc,spillgen,layout,copy,rce+,stack,break-,iprof-,peephole,emitter!,si_insts,gcmap,info,unlock_method
-XDjit.SD2_OPT.path.dce1=cg_dce
-XDjit.SD2_OPT.path.dce2=cg_dce
@@ -69,11 +71,22 @@
-XDjit.SD2_OPT.path.bp_regalloc1=bp_regalloc
-XDjit.SD2_OPT.path.bp_regalloc2=bp_regalloc
+#devirt configuration
+-XDjit.SD2_OPT.path.devirt_virtual=devirt
+-XDjit.SD2_OPT.path.devirt_intf=devirt
+-XDjit.SD2_OPT.arg.optimizer.devirt_intf.devirt_intf_calls=true
+-XDjit.SD2_OPT.arg.optimizer.devirt_intf.devirt_virtual_calls=false
+
#inliner configuration
-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.filter=-
--XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path=ssa,simplify,dce,uce,edge_annotate,devirt
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path=ssa,simplify,dce,uce,devirt_virtual,edge_annotate,unguard,devirt_intf
-XDjit.SD2_OPT.arg.optimizer.inline.pipeline=SD2_OPT_inliner_pipeline
-XDjit.SD2_OPT.arg.optimizer.inline.connect_early=false
+#devirt configuration for inliner pipeline
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path.devirt_virtual=devirt
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.path.devirt_intf=devirt
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.arg.devirt_intf.devirt_intf_calls=true
+-XDjit.SD2_OPT.SD2_OPT_inliner_pipeline.arg.devirt_intf.devirt_virtual_calls=false
#helper inliner configuration
-XDjit.SD2_OPT.SD2_OPT_helper_inliner_pipeline.filter=-
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp Fri Feb 2 03:25:01 2007
@@ -37,8 +37,6 @@
void ValueProfilerInstrumentationPass::_run(IRManager& irm)
{
// Currently value profile is used by interface devirtualization only
- const OptimizerFlags& optFlags = irm.getOptimizerFlags();
- if (!optFlags.devirt_intf_methods) return;
ControlFlowGraph& flowGraph = irm.getFlowGraph();
MemoryManager mm( 1024, "Value Profiler Instrumentation Pass");
@@ -116,8 +114,8 @@
const uint32 numArgs = 2;
Opnd* args[numArgs] = {indexOpnd, valueOpnd};
Inst* addValueInst = instFactory.makeJitHelperCall(opndManager.getNullOpnd(), AddValueProfileValue, numArgs, args);
- ((CFGInst *)loadIndexInst)->insertAfter(vtableInst);
- ((CFGInst *)addValueInst)->insertAfter(loadIndexInst);
+ ((CFGInst *)addValueInst)->insertBefore(call);
+ ((CFGInst *)loadIndexInst)->insertBefore(addValueInst);
}
}
}
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.cpp Fri Feb 2 03:25:01 2007
@@ -36,7 +36,7 @@
GuardedDevirtualizationPass::_run(IRManager& irm) {
computeDominators(irm);
DominatorTree* dominatorTree = irm.getDominatorTree();
- Devirtualizer pass(irm);
+ Devirtualizer pass(irm, this);
pass.guardCallsInRegion(irm, dominatorTree);
}
@@ -44,14 +44,15 @@
void
GuardRemovalPass::_run(IRManager& irm) {
- Devirtualizer pass(irm);
+ Devirtualizer pass(irm, this);
pass.unguardCallsInRegion(irm);
}
-Devirtualizer::Devirtualizer(IRManager& irm)
+Devirtualizer::Devirtualizer(IRManager& irm, SessionAction* sa)
: _hasProfileInfo(irm.getFlowGraph().hasEdgeProfile()),
_typeManager(irm.getTypeManager()),
- _instFactory(irm.getInstFactory()), _opndManager (irm.getOpndManager()) {
+ _instFactory(irm.getInstFactory()),
+ _opndManager (irm.getOpndManager()) {
const OptimizerFlags& optFlags = irm.getOptimizerFlags();
_doAggressiveGuardedDevirtualization = !_hasProfileInfo || optFlags.devirt_do_aggressive_guarded_devirtualization;
@@ -60,7 +61,8 @@
_devirtSkipExceptionPath = optFlags.devirt_skip_exception_path;
_devirtBlockHotnessMultiplier = optFlags.devirt_block_hotness_multiplier;
_devirtSkipJLObjectMethods = optFlags.devirt_skip_object_methods;
- _devirtInterfaceMethods = optFlags.devirt_intf_methods;
+ _devirtInterfaceCalls = sa ? sa->getBoolArg("devirt_intf_calls", false) : optFlags.devirt_intf_calls;
+ _devirtVirtualCalls = sa ? sa->getBoolArg("devirt_virtual_calls", true) : true;
_directCallPercent = optFlags.unguard_dcall_percent;
_directCallPercientOfEntry = optFlags.unguard_dcall_percent_of_entry;
@@ -139,6 +141,13 @@
// Perform guarded de-virtualization on calls in region
//
+ Log::out() << "Devirt params: " << std::endl;
+ Log::out() << " _doAggressiveGuardedDevirtualization: " << _doAggressiveGuardedDevirtualization << std::endl;
+ Log::out() << " _devirtUseCHAWithProfile: " << _devirtUseCHAWithProfile << std::endl;
+ Log::out() << " _devirtSkipJLObjectMethods: " << _devirtSkipJLObjectMethods << std::endl;
+ Log::out() << " _devirtInterfaceCalls: " << _devirtInterfaceCalls << std::endl;
+ Log::out() << " _devirtVirtualCalls: " << _devirtVirtualCalls << std::endl;
+
assert(dtree->isValid());
StlDeque<DominatorNode *> dom_stack(regionIRM.getMemoryManager());
@@ -348,6 +357,7 @@
if (_devirtSkipJLObjectMethods) {
const char* className = methodDesc.getParentType()->getName();
if (!strcmp(className, "java/lang/Object")) {
+ Log::out() << " Don't guard calls to java/lang/Object methods"<< std::endl;
return false;
}
}
@@ -356,6 +366,7 @@
//
// In this mode, always guard in the first pass
//
+ Log::out() << " Guarding calls to all methods aggressively"<< std::endl;
return true;
}
@@ -364,12 +375,20 @@
// node and the apparent target.
//
if(!_hasProfileInfo) {
+ Log::out() << " The node doesn't have profile info - don't guard"<< std::endl;
return false;
}
double methodCount = irm.getFlowGraph().getEntryNode()->getExecCount();
double blockCount = node->getExecCount();
- return (blockCount >= methodCount / _devirtBlockHotnessMultiplier);
+ if (blockCount < (methodCount / _devirtBlockHotnessMultiplier)) {
+ Log::out() << " Too small block count - don't guard"<< std::endl;
+ Log::out() << " methodCount: " << methodCount << ", blockCount = " << blockCount
+ << ", hotness factor: " << _devirtBlockHotnessMultiplier << std::endl;
+ return false;
+ }
+
+ return true;
}
void
@@ -390,10 +409,13 @@
assert(base->getType()->isObject());
ObjectType* baseType = (ObjectType*) base->getType();
- MethodDesc* origMethodDesc = methodInst->getMethodDesc();
-
+ bool intfCall = baseType->isInterface();
+ if (! ((_devirtInterfaceCalls && intfCall) || (_devirtVirtualCalls && !intfCall))) {
+ return;
+ }
// If base type is concrete, consider an explicit guarded test against it
- if(!baseType->isNullObject() && ((_devirtInterfaceMethods && baseType->isInterface()) || !baseType->isAbstract() || baseType->isArray())) {
+ if(!baseType->isNullObject() && ((_devirtInterfaceCalls && intfCall) || !baseType->isAbstract() || baseType->isArray())) {
+ MethodDesc* origMethodDesc = methodInst->getMethodDesc();
MethodDesc* candidateMeth = NULL;
int candidateExecCount = 0;
CompilationContext* cc = regionIRM.getCompilationContext();
@@ -406,12 +428,16 @@
methDesc.printFullName(Log::out());
Log::out() << std::endl << "call to the method: " << std::endl << "\t";
origMethodDesc->printFullName(Log::out());
- Log::out() << std::endl;
+ Log::out() << std::endl << "from the CFG node: " << node->getId() <<
+ ", node exec count: " << node->getExecCount() << std::endl;
ProfilingInterface* pi = cc->getProfilingInterface();
// Don't devirtualize if there is no value profile
if (!pi->hasMethodProfile(ProfileType_Value, methDesc)) return;
ValueMethodProfile* mp = pi->getValueMethodProfile(regionIRM.getMemoryManager(), methDesc);
+ if (Log::isLogEnabled(LogStream::DBG)) {
+ mp->dumpValues(Log::out());
+ }
MethodDesc* rootMethodDesc = regionIRM.getCompilationInterface().getMethodToCompile();
// Get bytecode offset of the call
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.h?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/devirtualizer.h Fri Feb 2 03:25:01 2007
@@ -31,7 +31,7 @@
class Devirtualizer {
public:
- Devirtualizer(IRManager& irm);
+ Devirtualizer(IRManager& irm, SessionAction* sa = NULL);
void guardCallsInRegion(IRManager& irm, DominatorTree* tree);
@@ -45,7 +45,7 @@
void guardCallsInBlock(IRManager& irm, Node* node);
void genGuardedDirectCall(IRManager& irm, Node* node, Inst* call, MethodDesc* methodDesc, ObjectType* valuedType, Opnd *tauNullChecked, Opnd *tauTypesChecked, uint32 argOffset);
bool doGuard(IRManager& irm, Node* node, MethodDesc& methodDesc);
-
+
bool _hasProfileInfo;
bool _doProfileOnlyGuardedDevirtualization;
bool _doAggressiveGuardedDevirtualization;
@@ -54,7 +54,8 @@
bool _devirtSkipExceptionPath;
float _devirtBlockHotnessMultiplier;
bool _devirtSkipJLObjectMethods;
- bool _devirtInterfaceMethods;
+ bool _devirtInterfaceCalls;
+ bool _devirtVirtualCalls;
//unguard pass params
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.cpp?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.cpp Fri Feb 2 03:25:01 2007
@@ -164,8 +164,8 @@
optimizerFlags.devirt_skip_exception_path = getBoolArg("devirt_skip_exception_path", true);
optimizerFlags.devirt_block_hotness_multiplier= (float)getIntArg("devirt_block_hotness_multiplier", 10);
optimizerFlags.devirt_skip_object_methods = getBoolArg("devirt_skip_object_methods", false);
- optimizerFlags.devirt_intf_methods = getBoolArg("devirt_intf_methods", true);
-
+ optimizerFlags.devirt_intf_calls = getBoolArg("devirt_intf_calls", false);
+
//unguard
optimizerFlags.unguard_dcall_percent = getIntArg("unguard_dcall_percent", 30);
optimizerFlags.unguard_dcall_percent_of_entry= getIntArg("unguard_dcall_percent_of_entry", 10);
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.h?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/optimizer/optimizer.h Fri Feb 2 03:25:01 2007
@@ -97,7 +97,7 @@
bool devirt_skip_exception_path;
float devirt_block_hotness_multiplier;
bool devirt_skip_object_methods;
- bool devirt_intf_methods;
+ bool devirt_intf_calls;
//unguard
int unguard_dcall_percent;
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/EMInterface.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/EMInterface.h?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/EMInterface.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/EMInterface.h Fri Feb 2 03:25:01 2007
@@ -132,7 +132,8 @@
public:
ValueMethodProfile (Method_Profile_Handle handle, MethodDesc& md) : MethodProfile(handle, ProfileType_Value, md){}
- virtual POINTER_SIZE_INT getTopValue(uint32 instructionKey) const = 0;
+ virtual POINTER_SIZE_INT getTopValue(uint32 instructionKey) const = 0;
+ virtual void dumpValues(std::ostream& os) const = 0;
};
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp Fri Feb 2 03:25:01 2007
@@ -264,6 +264,11 @@
return profileAccessInterface->value_profiler_get_top_value(getHandle(), instructionKey);
}
+void DrlValueMethodProfile::dumpValues(std::ostream& os) const {
+ profileAccessInterface->value_profiler_dump_values(getHandle(), os);
+}
+
+
} //namespace
Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.h?view=diff&rev=502579&r1=502578&r2=502579
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.h Fri Feb 2 03:25:01 2007
@@ -104,6 +104,7 @@
public:
DrlValueMethodProfile (Method_Profile_Handle handle, MethodDesc& md, EM_ProfileAccessInterface* profileAccessInterface);
virtual POINTER_SIZE_INT getTopValue(uint32 instructionKey) const;
+ virtual void dumpValues(std::ostream& os) const;
private:
EM_ProfileAccessInterface* profileAccessInterface;