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/29 08:29:47 UTC

svn commit: r490935 - in /harmony/enhanced/drlvm/trunk/vm/jitrino/src: dynopt/StaticProfiler.cpp shared/ControlFlowGraph.h

Author: varlax
Date: Thu Dec 28 23:29:46 2006
New Revision: 490935

URL: http://svn.apache.org/viewvc?view=rev&rev=490935
Log:
Applied HARMONY-2832 [drlvm][jitrino] Static profiler related fixes
Tested on SLES9

Modified:
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp
    harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/ControlFlowGraph.h

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp?view=diff&rev=490935&r1=490934&r2=490935
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/dynopt/StaticProfiler.cpp Thu Dec 28 23:29:46 2006
@@ -53,6 +53,7 @@
 #define PROB_DEVIRT_GUARD_HEURISTIC 0.62
 #define PROB_REFERENCE              0.60
 #define PROB_STORE_HEURISTIC        0.55
+#define PROB_FALLTHRU_HEURISTIC     0.45
 
 #define ACCEPTABLE_DOUBLE_PRECISION_LOSS  0.000000001 
 
@@ -70,6 +71,7 @@
 static double storeHeuristic(const StaticProfilerContext*);
 static double referenceHeuristic(const StaticProfilerContext*);
 static double devirtGuardHeuristic(const StaticProfilerContext*);
+static double fallThruHeuristic(const StaticProfilerContext*);
 static void setHeatThreshold(IRManager& irm);
 typedef std::vector<std::string> StringList;
 static void splitString(const char* string, StringList& result, char separator, bool notEmptyTokensOnly);
@@ -90,6 +92,7 @@
     Heuristics("store", storeHeuristic),
     Heuristics("ref", referenceHeuristic),
     Heuristics("guard", devirtGuardHeuristic),
+    Heuristics("ft", fallThruHeuristic),
     Heuristics("", NULL)
 };
 
@@ -154,14 +157,15 @@
         if (!defaultHeuristicsInited) {
             initMutex.lock();
             if (!defaultHeuristicsInited) {
-                getHeuristicsByNamesList("loop,ret,guard", defaultHeuristics);
+                getHeuristicsByNamesList("loop,ret,ft,guard", defaultHeuristics);
+                defaultHeuristicsInited = true;
             }
             initMutex.unlock();
         }
     }
     
     template <class Container> 
-    static void getHeuristicsByNamesList(const char* list, Container result) {
+    static void getHeuristicsByNamesList(const char* list, Container& result) {
         StringList nameList;
         splitString(list, nameList, ',', true);
         for (StringList::const_iterator it = nameList.begin(), end = nameList.end(); it!=end; ++it) {
@@ -332,21 +336,26 @@
         c->edge2 = falseEdge;
         if (c->doLoopHeuristicsOverride && isLoopHeuristicAcceptable(c)) {
             prob = c->loopTree->isLoopExit(trueEdge) ? PROB_LOOP_EXIT : 1 - PROB_LOOP_EXIT;
-        } else {
+        } else if (c->node->getTraversalNum() == c->fg->getTraversalNum()) {//node is reachable
             // from this point we can apply general heuristics
             for (StlVector<Heuristics*>::const_iterator it = c->heuristics.begin(), end = c->heuristics.end(); it!=end; ++it) {
                 Heuristics* h = *it;
                 HeuristicsFn fn = h->fn;
                 double dprob = (*fn)(c);
+                assert(dprob>0 && dprob<1);
                 if (dprob!=PROB_HEURISTIC_FAIL) {
-                    prob = prob * dprob / (prob*dprob + (1-prob)*(1-dprob));
+                    double newprob = prob * dprob / (prob*dprob + (1-prob)*(1-dprob));
+                    assert(newprob>0 && newprob<1);
+                    prob = newprob;
                 }
             }
         }
         // all other edges (exception, catch..) have lower probability
         double othersProb = edges.size() == 2 ? 0.0 : PROB_ALL_EXCEPTIONS;
-        trueEdge->setEdgeProb(MAX(PROB_ALL_EXCEPTIONS, prob - othersProb/2));
-        falseEdge->setEdgeProb(MAX(PROB_ALL_EXCEPTIONS, 1 - prob - othersProb/2));
+        trueEdge->setEdgeProb(prob - othersProb/2);
+        falseEdge->setEdgeProb(1 - prob - othersProb/2);
+        assert(trueEdge->getEdgeProb()!=0);
+        assert(falseEdge->getEdgeProb()!=0);
         probLeft = othersProb;
         edgesLeft-=2;
     }
@@ -567,6 +576,16 @@
         return PROB_HEURISTIC_FAIL;
     }
     return node1Accepted ? 1 - PROB_STORE_HEURISTIC: PROB_STORE_HEURISTIC;
+}
+/**
+ * Give more prob to fallthru branch
+ */
+static double fallThruHeuristic(const StaticProfilerContext * c) {
+    Inst* inst = (Inst*)c->node->getLastInst();
+    if (inst->getOpcode() != Op_Branch) {
+        return PROB_HEURISTIC_FAIL;
+    }
+    return PROB_FALLTHRU_HEURISTIC;
 }
 
 /** Reference heuristic (RH)

Modified: harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/ControlFlowGraph.h
URL: http://svn.apache.org/viewvc/harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/ControlFlowGraph.h?view=diff&rev=490935&r1=490934&r2=490935
==============================================================================
--- harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/ControlFlowGraph.h (original)
+++ harmony/enhanced/drlvm/trunk/vm/jitrino/src/shared/ControlFlowGraph.h Thu Dec 28 23:29:46 2006
@@ -1664,8 +1664,9 @@
     template <class Container>
     void runDFS(Container* preOrderContainer, Container* postOrderContainer, bool isForward) {
         Node* startNode;
+        traversalNumber++;
         if (isForward) {
-            lastOrderingTraversalNumber = ++traversalNumber;
+            lastOrderingTraversalNumber = traversalNumber;
             postOrderCache.clear();
             if (entryNode==NULL) {
                 return;
@@ -1685,7 +1686,7 @@
         }
     }
     
-  /// Helper for public <code>getNodesPre/PostOrder</code> methods above.
+  /// Helper for public <code>getNodesPre/PostOrder</code> methods above. Warn: increment cfg traversal num before use.
    
     template <class Container>
     void getNodesDFS(Container* preOrderContainer, Container* postOrderContainer, Node* node, bool isForward=true) {