Destination passing style, in its most trivial and unoptimized form, will just create a new destination for every high-level operation. So you do not need to be clever or do any kind of analysis (but of course you can and you decisions will be carried forward). What we gain is a uniform way to express shape computations of results (as @_sean_silva also mentioned). It is also helpful when doing tiling, as it allows us to express access patterns to the overall result by tiled computations while still using a tensor based representation.
Once in destination passing style (and accompanied by an interface), we can then go about optimizing things at the tensor level independent of operations themselves.
Destination passing style itself it an old idea, I found this paper a nice read in the context of array programming that describes the allocation + shape functions aspect well.