1. In a computing environment, a method comprising: detecting code patterns in a concurrent program with respect to code that has any combination of interactions between threads, global state or scheduling; modifying code fragments of the concurrent program, including instrumenting code by placing at least one iteration counter in at least one code fragment; statically analyzing the instrumented code to compute upper bounds on at least some of the iteration counters; and providing summary data of executing the concurrent program, including by analyzing the iteration counters, shared resources and interaction patterns, and by providing a computation graph differentiating wait nodes and signal nodes, by associating a half edge with each wait node or signal node to signify when a matching call is unresolved in a first computation phase, and by resolving the half edges to full edges in a second computation phase.