1. A method comprising: applying a first level of abstraction to model a plurality of run-time objects of a computer software application to produce a set of object abstractions of the run-time objects; producing a first data-flow propagation graph using the set of object abstractions; identifying a data-flow bottleneck within the first data-flow propagation graph; applying a second level of abstraction to model any of the run-time objects having in the set of object abstractions a corresponding object abstraction that is traceable to the data-flow bottleneck, where applying the second level of abstraction decomposes the corresponding object abstraction into a plurality of object abstractions, thereby producing a modified the set of object abstractions; and performing static data-flow analysis of the computer software application using the modified set of object abstractions.