An interprocedural framework for data redistributions in distributed memory machines