You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by ge...@apache.org on 2006/10/24 19:09:31 UTC

svn commit: r467390 - in /incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src: dynopt/EdgeProfiler.cpp vm/drl/DrlEMInterface.cpp

Author: geirm
Date: Tue Oct 24 10:09:30 2006
New Revision: 467390

URL: http://svn.apache.org/viewvc?view=rev&rev=467390
Log:
HARMONY-1689

Fixes for edge profiler.  I can't demonstrate the error (don't have specJBB)
so please verify.

This fix seemed to do no harm to standard test set

Ubuntu 6 - c-unit, smoke, ~kernel



Modified:
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/EdgeProfiler.cpp
    incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/EdgeProfiler.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/EdgeProfiler.cpp?view=diff&rev=467390&r1=467389&r2=467390
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/EdgeProfiler.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/EdgeProfiler.cpp Tue Oct 24 10:09:30 2006
@@ -40,7 +40,7 @@
 
 static bool isMethodTrivial( ControlFlowGraph& cfg );
 static uint32 computeCheckSum( MemoryManager& mm, ControlFlowGraph& cfg,  const StlSet<Node*>& nodesToIgnore);
-static void calculateProbsFromProfile(MemoryManager& mm, ControlFlowGraph& fg, const Edges& edges, DominatorTree* dt, LoopTree* lt, EdgeMethodProfile* profile, bool bcLevelProfiling, const StlSet<Node*>& nodesToIgnore);
+static bool calculateProbsFromProfile(MemoryManager& mm, ControlFlowGraph& fg, const Edges& edges, DominatorTree* dt, LoopTree* lt, EdgeMethodProfile* profile, bool bcLevelProfiling, const StlSet<Node*>& nodesToIgnore);
 static Node* selectNodeToInstrument(IRManager& irm, Edge* edge);
 static void selectEdgesToInstrument(MemoryManager& mm, IRManager& irm, Edges& result, const StlSet<Node*>& nodesToIgnore);
 static uint32 genKey( uint32 n, Edge* edge, bool bcLevel, bool debug);
@@ -60,8 +60,6 @@
     bool debug = Log::isEnabled();
     LoopTree* lt = irm.getLoopTree();    
 
-    //printDotFile(irm, true, "inside");
-    //printHIR(irm, true, "inside");
 
     //set of nodes with out-edges are not taken into account during instrumentation
     //and checksum calculation
@@ -138,7 +136,7 @@
     if (isMethodTrivial(flowGraph) || !edgeProfilerMode || entryCount == 0) { 
         // Annotate the CFG using static profiler heuristics.
         if (debug) {
-            Log::out()<<"Using static profiler to estimate graph"<<std::endl;
+            Log::out()<<"Using static profiler to estimate trivial graph"<<std::endl;
         }
         StaticProfiler::estimateGraph(irm, entryCount);
         return;
@@ -147,8 +145,6 @@
     OptPass::computeDominatorsAndLoops(irm);
     DominatorTree* dt = irm.getDominatorTree();
 
-//    printDotFile(irm, true, "inside");
-
     LoopTree* lt = irm.getLoopTree();
 
     // sync checksum
@@ -159,22 +155,24 @@
 
     EdgeMethodProfile* edgeProfile = pi->getEdgeMethodProfile(mm, md);
     uint32 profileCheckSum = edgeProfile->getCheckSum();
-    assert(profileCheckSum == cfgCheckSum);
-    if (cfgCheckSum != profileCheckSum) {
-        if (Log::isEnabled()) {
-            Log::out() << "ERROR: invalid CFG checksum!";
+    //assert(profileCheckSum == cfgCheckSum);
+    if (cfgCheckSum == profileCheckSum) {
+        // Start propagating the CFG from instrumented edges.
+        Edges edges(mm);
+        selectEdgesToInstrument(mm, irm, edges, nodesToIgnore);
+        assert(edges.size() == edgeProfile->getNumCounters());
+        bool bcLevelProfiling = false; //TODO:
+        bool res = calculateProbsFromProfile(mm, flowGraph, edges, dt, lt, edgeProfile, bcLevelProfiling, nodesToIgnore);
+        if (res) {
+            flowGraph.setEdgeProfile(true);
         }
-        return;
     }
-    
-    // Start propagating the CFG from instrumented edges.
-    Edges edges(mm);
-    selectEdgesToInstrument(mm, irm, edges, nodesToIgnore);
-    assert(edges.size() == edgeProfile->getNumCounters());
-    bool bcLevelProfiling = false; //TODO:
-    calculateProbsFromProfile(mm, flowGraph, edges, dt, lt, edgeProfile, bcLevelProfiling, nodesToIgnore);
-    flowGraph.setEdgeProfile(true);
-    
+    if (!flowGraph.hasEdgeProfile()) {
+        if (debug) {
+            Log::out()<<"DynProf failed: using static profiler to estimate graph!"<<std::endl;
+        }
+        StaticProfiler::estimateGraph(irm, 10000, true);
+    }
     if (irm.getParent() == NULL) {
         // fix profile: estimate cold paths that was never executed and recalculate frequencies
         StaticProfiler::fixEdgeProbs(irm); 
@@ -205,7 +203,7 @@
     }
 }
 
-static void calculateProbsFromProfile(MemoryManager& mm, ControlFlowGraph& fg, const Edges& pEdges, 
+static bool calculateProbsFromProfile(MemoryManager& mm, ControlFlowGraph& fg, const Edges& pEdges, 
                                       DominatorTree* dt, LoopTree* lt, EdgeMethodProfile* profile, 
                                       bool bcLevelProfiling, const StlSet<Node*>& nodesToIgnore) 
 {
@@ -238,7 +236,12 @@
     for (Edges::const_iterator it = pEdges.begin(), end = pEdges.end(); it!=end; ++it, ++n) {
         Edge* edge = *it;
         uint32 key = genKey(n, edge, bcLevelProfiling, debug);
-        uint32 freq = *profile->getCounter(key);
+        uint32* counterAddr = profile->getCounter(key);
+        assert(counterAddr!=NULL);
+        if (counterAddr == NULL) {
+            return false;
+        }
+        uint32 freq = *counterAddr;
         setEdgeFreq(edgeFreqs, edge, freq, debug);
     }
 
@@ -388,7 +391,7 @@
         } 
     }
     
-#ifdef _DEBUG
+#if 0
     //2.99 debug check : check that every child node in dom-tree that is in the same loop as parent
     //has nodeFreq <= parent freq
     if (debug) {
@@ -425,14 +428,14 @@
             double edgeFreq =edgeFreqs[edge->getId()];
             assert(edgeFreq!=-1);
             double edgeProb = nodeFreq == 0 ? 0 : edgeFreq / nodeFreq ;
-            assert(edgeProb >= 0 && edgeProb <= 1);
+//            assert(edgeProb >= 0 && edgeProb <= 1);
             edge->setEdgeProb(edgeProb);
         }
     }
     if (debug) {
         Log::out()<<"Finished probs calculation";
     }
-
+    return true;
 }
 
 //
@@ -687,30 +690,19 @@
     uint32 key = 0;
     if (bcLevel) {
         assert(0); //TODO:
-        /*Node* node = edge->getSourceNode();
-        Inst* lastInst = node->getLastInst();
-
-        if( lastInst->getOpcode() == Op_Branch || lastInst->getOpcode() == Op_Jump ){
-                BranchInst* br = (BranchInst*)lastInst;
-                const uint32 bcAddr = getBcAddr(br);
-                Node* targetNode = edge->getTargetNode();
-
-                // Only instrument valid taken branches.
-                if( ( bcAddr != 0 ) && ( br->getTargetLabel() == targetNode->getFirstInst() ) ){
-                    assert( (bcAddr & 0xffff0000) != 0 );
-                    return (uint32)bcAddr;
-                }
-            }
-            return 0;
-        }*/
     } else {
+        //TODO: this algorithm is not 100% effective: we can't rely on edges order in CFG
         uint32 edgePos = 0;
         const Edges& edges = edge->getSourceNode()->getOutEdges();
-        for (Edges::const_iterator it = edges.begin(), end = edges.end(); it!=end; ++it, edgePos++) {
+        for (Edges::const_iterator it = edges.begin(), end = edges.end(); it!=end; ++it) {
             Edge* outEdge = *it;
             if (outEdge == edge) {
                 break;
             }
+            if (outEdge->isDispatchEdge()) { //dispatch edge order is the reason of the most of the edge ordering errors 
+                continue;
+            }
+            edgePos++;
         }
 
         key = pos + (edgePos << 16);

Modified: incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp
URL: http://svn.apache.org/viewvc/incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp?view=diff&rev=467390&r1=467389&r2=467390
==============================================================================
--- incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp (original)
+++ incubator/harmony/enhanced/drlvm/trunk/vm/jitrino/src/vm/drl/DrlEMInterface.cpp Tue Oct 24 10:09:30 2006
@@ -204,7 +204,6 @@
 
 uint32* DrlEdgeMethodProfile::getCounter(uint32 key) const  {
     uint32* counter = (uint32*)profileAccessInterface->edge_profiler_get_counter_addr(getHandle(), key);
-    assert(counter!=NULL);
     return counter;
 }