treport += "\nFixed point algorithm visited "+totalMethodVisits+
" methods and "+totalNodeVisits+" nodes.";
}
+ if( state.DISJOINT_COUNT_GRAPH_ELEMENTS ) {
+ treport += "\n"+getPartial( mdSourceEntry ).countGraphElements()+"\n";
+ }
String justtime = String.format("%.2f", dt);
System.out.println(treport);
}
}
- assert hrnCalleeAndOutContext.reachHasOnlyOOC();
+ if( !DISABLE_GLOBAL_SWEEP ) {
+ assert hrnCalleeAndOutContext.reachHasOnlyOOC();
+ }
rg.addRefEdge(hrnCalleeAndOutContext,
hrnDstCallee,
return null;
}
+
+
+ public String countGraphElements() {
+ long numNodes = 0;
+ long numEdges = 0;
+ long numNodeStates = 0;
+ long numEdgeStates = 0;
+ long numNodeStateNonzero = 0;
+ long numEdgeStateNonzero = 0;
+
+ for( HeapRegionNode node : id2hrn.values() ) {
+ numNodes++;
+ numNodeStates += node.getAlpha().numStates();
+ numNodeStateNonzero += node.getAlpha().numNonzeroTuples();
+
+ // all edges in the graph point TO a heap node, so scanning
+ // all referencers of all nodes gets every edge
+ Iterator<RefEdge> refItr = node.iteratorToReferencers();
+ while( refItr.hasNext() ) {
+ RefEdge edge = refItr.next();
+
+ numEdges++;
+ numEdgeStates += edge.getBeta().numStates();
+ numEdgeStateNonzero += edge.getBeta().numNonzeroTuples();
+ }
+ }
+
+ return
+ "################################################\n"+
+ "Nodes = "+numNodes+"\n"+
+ "Edges = "+numEdges+"\n"+
+ "Node states = "+numNodeStates+"\n"+
+ "Edge states = "+numEdgeStates+"\n"+
+ "Node non-zero tuples = "+numNodeStateNonzero+"\n"+
+ "Edge non-zero tuples = "+numEdgeStateNonzero+"\n"+
+ "################################################\n";
+ }
}
return s+"]";
}
+
+ public long numStates() {
+ return reachStates.size();
+ }
+
+ public long numNonzeroTuples() {
+ long n = 0;
+ for( ReachState state: reachStates ) {
+ n += state.numNonzeroTuples();
+ }
+ return n;
+ }
}
}
return toStringPreds();
}
+
+
+ public long numNonzeroTuples() {
+ return reachTuples.size();
+ }
}
# EX: (skip first 10 visits, capture the next 3, then halt)
# -disjoint-debug-snap-method Remove 10 3 true
-DISJOINTDEBUG= -disjoint -disjoint-k 1 -enable-assertions $(DRELEASEMODE)
-# -disjoint-disable-predicates \
+DISJOINTDEBUG= -disjoint -disjoint-k 1 -enable-assertions $(DRELEASEMODE) \
+ -justanalyze \
+ -disjoint-count-graph-elements
+# -disjoint-disable-global-sweep \
+# -disjoint-disable-strong-update
# -disjoint-summarize-per-class
+# -disjoint-disable-predicates \
+#
# -disjoint-write-dots final
# -do-definite-reach-analysis \
-# -disjoint-disable-global-sweep \
-# -disjoint-disable-strong-update \
# -disjoint-debug-scheduling
# -disjoint-debug-callsite Barneshut.Insert Barneshut.run 50 500 true
# -disjoint-debug-snap-method ArrayIndexedGraph.createNode 1 100 true \
# -disjoint-debug-snap-method FileInputStream.readLine 1 1000 true
# -disjoint-write-all-node-graphs
#
-# -justanalyze \
# -disjoint-debug-callsite String.toString String.valueOf 1 1000 true \
# -disjoint-desire-determinism
# -disjoint-debug-callsite Demand.add Lateral.compute 1 1000 true
public boolean DISJOINTDEBUGSCHEDULING=false;
public boolean DISJOINT_WRITE_ALL_NODE_FINAL_GRAPHS=false;
public boolean DISJOINT_COUNT_VISITS=false;
+ public boolean DISJOINT_COUNT_GRAPH_ELEMENTS=false;
public boolean POINTSTO_CHECK_V_RUNTIME=false;
state.DISJOINT_SUMMARIZE_PER_CLASS = true;
- } else if( option.equals("-count-visits") ) {
+ } else if( option.equals("-disjoint-count-visits") ) {
state.DISJOINT_COUNT_VISITS = true;
+ } else if( option.equals("-disjoint-count-graph-elements") ) {
+ state.DISJOINT_COUNT_GRAPH_ELEMENTS = true;
+
} else if (option.equals("-optional"))
state.OPTIONAL=true;
BUILDSCRIPT=../../../buildscript
-DISJOINT= -disjoint -disjoint-k 1 -enable-assertions -do-definite-reach-analysis
+DISJOINT= -disjoint -disjoint-k 1 -enable-assertions -do-definite-reach-analysis -disjoint-count-graph-elements -disjoint-write-dots final
BSFLAGS= -justanalyze -mainclass $(PROGRAM) -heapsize-mb 1024 -noloop -joptimize -debug #-flatirusermethods
echo -disjoint-dvisit-pqueue use prio. q strat to visit descriptors
echo -disjoint-desire-determinism set above interproc for determinism
echo -disjoint-debug-scheduling debug when methods are scheduled for analysis
-echo -count-visits for counting visits in the fixed point algorithm to evaluate convergence behavior
+echo -disjoint-count-visits for counting visits in the fixed point algorithm to evaluate convergence behavior
+echo -disjoint-count-graph-elements nodes, edges and states in final graph for main method context
echo
echo -do-definite-reach-analysis enable improved precision for disjoint reachability analysis
echo -disjoint-disable-global-sweep