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 2006/12/15 07:33:55 UTC
svn commit: r487463 -
/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp
Author: varlax
Date: Thu Dec 14 22:33:54 2006
New Revision: 487463
URL: http://svn.apache.org/viewvc?view=rev&rev=487463
Log:
Set svn:eol-style=native on recently added file.
Strange that tortoiseSVN ignored autoprops...
Modified:
harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp (contents, props changed)
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=487463&r1=487462&r2=487463
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp Thu Dec 14 22:33:54 2006
@@ -1,143 +1,143 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one or more
-* contributor license agreements. See the NOTICE file distributed with
-* this work for additional information regarding copyright ownership.
-* The ASF licenses this file to You under the Apache License, Version 2.0
-* (the "License"); you may not use this file except in compliance with
-* the License. You may obtain a copy of the License at
-*
-* http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-/* COPYRIGHT_NOTICE */
-
-/**
-* @author Pavel Ozhdikhin
-* @version $Revision$
-*/
-
-
-#include "Jitrino.h"
-#include "optpass.h"
-#include "devirtualizer.h"
-#include "irmanager.h"
-#include "Inst.h"
-#include "FlowGraph.h"
-#include "EMInterface.h"
-
-namespace Jitrino {
-
-DEFINE_SESSION_ACTION(ValueProfilerInstrumentationPass, vp_instrument, "Perform value profiler instrumentation pass")
-
-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");
- MethodDesc& md = irm.getMethodDesc();
- InstFactory& instFactory = irm.getInstFactory();
- OpndManager& opndManager = irm.getOpndManager();
- TypeManager& typeManager = irm.getTypeManager();
- StlVector<uint32> counterKeys(mm);
- bool debug = Log::isEnabled();
- uint32 key = 0;
-
- StlVector<Node*> nodes(mm);
- flowGraph.getNodesPostOrder(nodes);
- for (StlVector<Node*>::const_iterator it = nodes.begin(), end = nodes.end(); it!=end; ++it) {
- Node* node = *it;
- if(node->isBlockNode()) {
- Inst* lastInst = (Inst*)node->getLastInst();
- MethodInst* methodInst = NULL;
- Opnd* base = NULL;
- Opnd* tauNullChecked = NULL;
- Opnd* tauTypesChecked = NULL;
- uint32 argOffset = 0;
- if(Devirtualizer::isGuardableVirtualCall(lastInst, methodInst, base, tauNullChecked, tauTypesChecked, argOffset)) {
- assert(methodInst && base && tauNullChecked && tauTypesChecked && argOffset);
- assert(base->getType()->isObject());
-
- CallInst* call = lastInst->asCallInst();
- assert(call != NULL);
-
- if (debug) {
- Log::out() << "Indirect call detected. \n\tNode: ";
- FlowGraph::printLabel(Log::out(), node);
- Log::out() << "\n\tCall inst: ";
- call->print(Log::out());
- Log::out() << std::endl;
- }
-
- Inst* vtableInst = methodInst->getSrc(0)->getInst();
- Opcode vtableInstOpcode = vtableInst->getOpcode();
- if (vtableInstOpcode == Op_TauLdVTableAddr) {
- // That is what we are looking for
- if (debug) {
- Log::out() << "\tFound ldVTable instruction to instrument: ";
- vtableInst->print(Log::out());
- Log::out() << std::endl;
- }
- // Don't profile virtual calls so far
- continue;
- } else if (vtableInstOpcode == Op_TauLdIntfcVTableAddr) {
- // Need to generate VTable loading
- Opnd* vTable = opndManager.createSsaTmpOpnd(typeManager.getVTablePtrType(typeManager.getSystemObjectType()));
- Inst* ldVtableInst = instFactory.makeTauLdVTableAddr(vTable, base, tauNullChecked);
- ((CFGInst *)ldVtableInst)->insertBefore(vtableInst);
- vtableInst = ldVtableInst;
- if (debug) {
- Log::out() << "\tInserted ldVTable instruction to instrument: ";
- ldVtableInst->print(Log::out());
- Log::out() << std::endl;
- }
- } else {
- assert(0);
- }
- VectorHandler* bc2HIRMapHandler = new VectorHandler(bcOffset2HIRHandlerName, &md);
- uint64 callInstId = (uint64)lastInst->getId();
- key = (uint32)bc2HIRMapHandler->getVectorEntry(callInstId);
- assert(key != 0);
- if (debug) {
- Log::out() << "Use call instruction bcOffset = " << (int32)key << std::endl;
- }
-
- Opnd* indexOpnd = opndManager.createSsaTmpOpnd(typeManager.getInt32Type());
- Inst* loadIndexInst = instFactory.makeLdConst(indexOpnd, (int32)key);
- counterKeys.push_back(key);
- Opnd* valueOpnd = vtableInst->getDst();
- 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);
- }
- }
- }
-
- uint32 cc_size = counterKeys.size();
- if (cc_size == 0) return;
-
- irm.getCompilationInterface().lockMethodData();
-
- ProfilingInterface* pi = irm.getProfilingInterface();
- if (!pi->hasMethodProfile(ProfileType_Value, md, JITProfilingRole_GEN)) {
- pi->createValueMethodProfile(mm , md, cc_size, (uint32*)&counterKeys.front());
- }
-
- irm.getCompilationInterface().unlockMethodData();
-
- if (debug) {
- Log::out() << std::endl << "ValuePC:: instrumented, nCounters = " << cc_size << std::endl;
- }
-
-}
-
-} //namespace
+/*
+* Licensed to the Apache Software Foundation (ASF) under one or more
+* contributor license agreements. See the NOTICE file distributed with
+* this work for additional information regarding copyright ownership.
+* The ASF licenses this file to You under the Apache License, Version 2.0
+* (the "License"); you may not use this file except in compliance with
+* the License. You may obtain a copy of the License at
+*
+* http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+/* COPYRIGHT_NOTICE */
+
+/**
+* @author Pavel Ozhdikhin
+* @version $Revision$
+*/
+
+
+#include "Jitrino.h"
+#include "optpass.h"
+#include "devirtualizer.h"
+#include "irmanager.h"
+#include "Inst.h"
+#include "FlowGraph.h"
+#include "EMInterface.h"
+
+namespace Jitrino {
+
+DEFINE_SESSION_ACTION(ValueProfilerInstrumentationPass, vp_instrument, "Perform value profiler instrumentation pass")
+
+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");
+ MethodDesc& md = irm.getMethodDesc();
+ InstFactory& instFactory = irm.getInstFactory();
+ OpndManager& opndManager = irm.getOpndManager();
+ TypeManager& typeManager = irm.getTypeManager();
+ StlVector<uint32> counterKeys(mm);
+ bool debug = Log::isEnabled();
+ uint32 key = 0;
+
+ StlVector<Node*> nodes(mm);
+ flowGraph.getNodesPostOrder(nodes);
+ for (StlVector<Node*>::const_iterator it = nodes.begin(), end = nodes.end(); it!=end; ++it) {
+ Node* node = *it;
+ if(node->isBlockNode()) {
+ Inst* lastInst = (Inst*)node->getLastInst();
+ MethodInst* methodInst = NULL;
+ Opnd* base = NULL;
+ Opnd* tauNullChecked = NULL;
+ Opnd* tauTypesChecked = NULL;
+ uint32 argOffset = 0;
+ if(Devirtualizer::isGuardableVirtualCall(lastInst, methodInst, base, tauNullChecked, tauTypesChecked, argOffset)) {
+ assert(methodInst && base && tauNullChecked && tauTypesChecked && argOffset);
+ assert(base->getType()->isObject());
+
+ CallInst* call = lastInst->asCallInst();
+ assert(call != NULL);
+
+ if (debug) {
+ Log::out() << "Indirect call detected. \n\tNode: ";
+ FlowGraph::printLabel(Log::out(), node);
+ Log::out() << "\n\tCall inst: ";
+ call->print(Log::out());
+ Log::out() << std::endl;
+ }
+
+ Inst* vtableInst = methodInst->getSrc(0)->getInst();
+ Opcode vtableInstOpcode = vtableInst->getOpcode();
+ if (vtableInstOpcode == Op_TauLdVTableAddr) {
+ // That is what we are looking for
+ if (debug) {
+ Log::out() << "\tFound ldVTable instruction to instrument: ";
+ vtableInst->print(Log::out());
+ Log::out() << std::endl;
+ }
+ // Don't profile virtual calls so far
+ continue;
+ } else if (vtableInstOpcode == Op_TauLdIntfcVTableAddr) {
+ // Need to generate VTable loading
+ Opnd* vTable = opndManager.createSsaTmpOpnd(typeManager.getVTablePtrType(typeManager.getSystemObjectType()));
+ Inst* ldVtableInst = instFactory.makeTauLdVTableAddr(vTable, base, tauNullChecked);
+ ((CFGInst *)ldVtableInst)->insertBefore(vtableInst);
+ vtableInst = ldVtableInst;
+ if (debug) {
+ Log::out() << "\tInserted ldVTable instruction to instrument: ";
+ ldVtableInst->print(Log::out());
+ Log::out() << std::endl;
+ }
+ } else {
+ assert(0);
+ }
+ VectorHandler* bc2HIRMapHandler = new VectorHandler(bcOffset2HIRHandlerName, &md);
+ uint64 callInstId = (uint64)lastInst->getId();
+ key = (uint32)bc2HIRMapHandler->getVectorEntry(callInstId);
+ assert(key != 0);
+ if (debug) {
+ Log::out() << "Use call instruction bcOffset = " << (int32)key << std::endl;
+ }
+
+ Opnd* indexOpnd = opndManager.createSsaTmpOpnd(typeManager.getInt32Type());
+ Inst* loadIndexInst = instFactory.makeLdConst(indexOpnd, (int32)key);
+ counterKeys.push_back(key);
+ Opnd* valueOpnd = vtableInst->getDst();
+ 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);
+ }
+ }
+ }
+
+ uint32 cc_size = counterKeys.size();
+ if (cc_size == 0) return;
+
+ irm.getCompilationInterface().lockMethodData();
+
+ ProfilingInterface* pi = irm.getProfilingInterface();
+ if (!pi->hasMethodProfile(ProfileType_Value, md, JITProfilingRole_GEN)) {
+ pi->createValueMethodProfile(mm , md, cc_size, (uint32*)&counterKeys.front());
+ }
+
+ irm.getCompilationInterface().unlockMethodData();
+
+ if (debug) {
+ Log::out() << std::endl << "ValuePC:: instrumented, nCounters = " << cc_size << std::endl;
+ }
+
+}
+
+} //namespace
Propchange: harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/ValueProfiler.cpp
------------------------------------------------------------------------------
svn:eol-style = native