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