Reviewers: cromwellian,

Description:
Make CodeSplitter2 outputs a reasonable SOYC.


Please review this at http://gwt-code-reviews.appspot.com/1726803/

Affected files:
  M dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java


Index: dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java
===================================================================
--- dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java (revision 10971) +++ dev/core/src/com/google/gwt/dev/jjs/impl/CodeSplitter2.java (working copy)
@@ -88,7 +88,6 @@
* TODO(acleung): Figure out how to integrate with SOYC and dependency tracker.
  * TODO(acleung): Insert SpeedTracer calls at performance sensitive places.
  * TODO(acleung): Insert logger calls to generate meaningful logs.
- * TODO(acleung): May be add back the old heuristics if needed.
  */
 public class CodeSplitter2 {

@@ -107,9 +106,6 @@
private FragmentPartitioningResult(int[] splitPointToFragmentMap, int numFragments) {
       this.splitPointToFragmentMap = splitPointToFragmentMap;
       fragmentToSplitPoint = new int[numFragments];
- for (int i = 0, len = splitPointToFragmentMap.length - 1; i < len; i++) { - System.out.println("splitPointToFragmentMap[" + i + "] = " + splitPointToFragmentMap[i]);
-      }
for (int i = 1, len = splitPointToFragmentMap.length - 1; i < len; i++) {
         if (fragmentToSplitPoint[splitPointToFragmentMap[i]] == 0) {
           fragmentToSplitPoint[splitPointToFragmentMap[i]] = i;
@@ -303,8 +299,10 @@
       return;
     }
Event codeSplitterEvent = SpeedTracerLogger.start(CompilerEventType.CODE_SPLITTER);
+    dependencyRecorder.open();
     new CodeSplitter2(
logger, jprogram, jsprogram, map, fragmentsToMerge, dependencyRecorder).execImpl();
+    dependencyRecorder.close();
     codeSplitterEvent.end();
   }

@@ -606,6 +604,8 @@
   }

   ExclusivityMap fragmentMap = new ExclusivityMap();
+
+  private MultipleDependencyGraphRecorder dependencyRecorder;

   private final Map<JField, JClassLiteral> fieldToLiteralOfClass;

@@ -656,6 +656,7 @@
     this.jprogram = jprogram;
     this.jsprogram = jsprogram;
     this.splitPointsMerge = splitPointsMerge;
+    this.dependencyRecorder = dependencyRecorder;
this.fragmentExtractor = new FragmentExtractor(jprogram, jsprogram, map); this.initialLoadSequence = new LinkedHashSet<Integer>(jprogram.getSplitPointInitialSequence());

@@ -699,10 +700,13 @@
     fragmentStats.put(splitPoint, stats);
   }

-  private ControlFlowAnalyzer computeAllButNCfas(
-      ControlFlowAnalyzer liveAfterInitialSequence, List<Integer> sp) {
+ private ControlFlowAnalyzer computeAllButNCfas( ControlFlowAnalyzer liveAfterInitialSequence,
+      List<Integer> sp, int fragmentIndex, String extnds) {
List<ControlFlowAnalyzer> allButOnes = new ArrayList<ControlFlowAnalyzer>(); ControlFlowAnalyzer cfa = new ControlFlowAnalyzer(liveAfterInitialSequence);
+
+    dependencyRecorder.startDependencyGraph("sp" + fragmentIndex, extnds);
+
     for (JRunAsync otherRunAsync : jprogram.getRunAsyncs()) {
       if (isInitial(otherRunAsync.getSplitPoint())) {
         continue;
@@ -712,6 +716,9 @@
       }
       cfa.traverseFromRunAsync(otherRunAsync);
     }
+
+    dependencyRecorder.endDependencyGraph();
+
     return cfa;
   }

@@ -786,16 +793,25 @@
     }

ControlFlowAnalyzer liveAfterInitialSequence = new ControlFlowAnalyzer(initiallyLive);
+    String extendsCfa = "initial";

     int cacheIndex = 1;
     // Initial Split Point.
     {
       for (final int sp : initialLoadSequence) {
-        splitPointToCodeIndexMap[sp] = cacheIndex;
+        splitPointToCodeIndexMap[sp] = cacheIndex;
+        String depGraphName = "sp" + cacheIndex;
+
+        // Records dependency Graph.
+        dependencyRecorder.startDependencyGraph(depGraphName, extendsCfa);
+        extendsCfa = depGraphName;
+
LivenessPredicate alreadyLoaded = new CfaLivenessPredicate(liveAfterInitialSequence); ControlFlowAnalyzer liveAfterSp = new ControlFlowAnalyzer(liveAfterInitialSequence);
         JRunAsync runAsync = jprogram.getRunAsyncs().get(sp - 1);
         liveAfterSp.traverseFromRunAsync(runAsync);
+        dependencyRecorder.endDependencyGraph();
+
         LivenessPredicate liveNow = new CfaLivenessPredicate(liveAfterSp);
List<JsStatement> statsToAppend = fragmentExtractor.createOnLoadedCall(cacheIndex); addFragment(sp, alreadyLoaded, liveNow, statsToAppend, fragmentStats);
@@ -847,7 +863,8 @@
         }
       }

- ControlFlowAnalyzer allButOne = computeAllButNCfas(liveAfterInitialSequence, splitPoints);
+      ControlFlowAnalyzer allButOne = computeAllButNCfas(
+          liveAfterInitialSequence, splitPoints, cacheIndex, extendsCfa);
       Set<JNode> allLiveNodes =
union(allButOne.getLiveFieldsAndMethods(), allButOne.getFieldsWritten());
       updateReverseMap(i, fragmentMap.fields, allLiveNodes, allFields);


--
http://groups.google.com/group/Google-Web-Toolkit-Contributors

Reply via email to