Store Splitting

Store splitting is a way of factoring dependence edges in graphical functional program representations (like the Value Dependence Graph). The factoring increases the amount of exposed parallelism in the representation as well as making the program representation more sparse.

From the perspective of program analyses, store splitting can be considered a generalization of SSA form for functional representations. A modern variant of SSA form called factored SSA form reduces the amount of dependence edges in the representation. This factorization of dependence edges focuses on (abstract) locations possibly updated by weak assignments. Another factorization focuses on assignment statements that may possibly affect overlapping sets of (abstract) locations. This other factorization corresponds to store splitting.

Erik Ruf demonstrated how points-to analysis by data-flow analysis can be performed faster using stores-splitting techniques (POPL'97 paper). Instead of performing the analysis for the entire store at the same time, the analysis can be performed piecemeal for fragments of the store. This reduces the size of intermediate data structures and reduces the cost of join operations.

Another perspective is that store splitting exposes parallelism in the program representation. In functional program representations, any implicit but accessible values like the store must be made explicit. An assignment in an imperative program is represented in functional program representations by an operation that takes a store value and some other arguments and returns a new store value. The store value threads all assignment operations and thus forces a sequentialization upon the computations that need not be there. Store splitting reduces that problem by splitting the monolithic store value into several smaller store values.

Regardless of perspective, store splitting short-circuits unused parts of the store around computations like updates and procedure calls, thereby speeding up data flow analyses. Also, singleton store values described by huge abstract values are split into many smaller store values described by smaller abstract values. For data flow analyses with superlinear join functions, it is cheaper to perform the join on the many smaller abstract values than on the few huge abstract values.

Store splitting is further described in Microsoft Research Technical Report MSR-TR-95-07: "Sparse Functional Stores for Imperative Programs".


Last modified July 22, 1997.
Bjarne Steensgaard