diff --git a/runtime/starpu/control/runtime_descriptor.c b/runtime/starpu/control/runtime_descriptor.c
index ee0698dff7f140da49c46f6cde749320256a8dea..f87818993dc99bef845d53f44fd2d8caa32521a3 100644
--- a/runtime/starpu/control/runtime_descriptor.c
+++ b/runtime/starpu/control/runtime_descriptor.c
@@ -416,11 +416,23 @@ void RUNTIME_data_migrate( const RUNTIME_sequence_t *sequence,
 
     lhandle = *handle;
     if ( lhandle == NULL ) {
+        int involved;
+
+        old_rank = A->get_rankof( A, Am, An );
+        involved = (A->myrank == old_rank) || (A->myrank == new_rank);
+
+        /* Quick return */
+        if ( !involved ) {
+            return;
+        }
+
         /* Register the data */
         lhandle = RUNTIME_data_getaddr( A, Am, An );
     }
-    old_rank = starpu_mpi_data_get_rank( lhandle );
 
+    /* Update the rank if has been moved already (cf qr for example) */
+    old_rank = starpu_mpi_data_get_rank( lhandle );
+    assert( old_rank == A->get_rankof( A, Am, An ) );
     if ( old_rank != new_rank ) {
         starpu_mpi_data_migrate( MPI_COMM_WORLD, lhandle, new_rank );
     }