High Performance Computing (HPC) clusters are composed of multiple computing units or memory storage memory storage units, also called "nodes", interconnected by a high-speed, low-latency network. Such an architecture is called "distributed". Computations are thus distributed among these nodes, each of which works on a section of a simulation, which reduces the execution time of simulations thanks to parallelism. However, the nodes must communicate their results to each other in order to advance in the calculations, which causes latencies. Message Passing Interface (MPI) is the solution most used in HPC to define these exchanges between compute nodes. In particular, it defines point-to-point communications and collective communications. These communications exist in three versions: blocking, non-blocking and persistent. Non-blocking communications allow a better use of computing resources by overlapping communications with computations, which reduces the time to obtain results. However, these non-blocking communications are more complex to use, and offer fewer security mechanisms. Developers are more likely to make programming errors that can lead to program crashes or corrupt results. This leads to less popularity of these communications to release recovery, especially the collective form introduced in the third major revision of the interface in 2012. The goal of this study is to propose methods to help developers use these communications. First, we propose a method to associate non-blocking calls when compiling an MPI program using information about the control flow and the data flow. Second, we propose a method to automatically transform blocking calls into their non-blocking version. This method will then reorganize the code of a function by moving the communication dependencies in order to maximize the size of the recovery intervals. This method is also applied on existing non-blocking calls by exploiting the associations found by the validation method. Finally, we exploit the limitations of the automatic transformation to propose a method to improve the overlap potential of MPI programs by identifying the bounds of these intervals and suggesting code modifications to apply. The three methods we propose have been implemented via LLVM runs, and tested on several benchmarks, including miniapps and CORAL codes.