diff --git a/compute/pzgebrd_ge2gb.c b/compute/pzgebrd_ge2gb.c
index 443e5321263b449663717562c44bd6552adc4966..b9d0ec1e631d76f7f383786f194e83fb1f73cf4a 100644
--- a/compute/pzgebrd_ge2gb.c
+++ b/compute/pzgebrd_ge2gb.c
@@ -25,12 +25,11 @@
  **/
 #include "control/common.h"
 
-void morse_pzgebrd_ge2gb(MORSE_desc_t A, MORSE_desc_t T,
+void morse_pzgebrd_ge2gb(MORSE_desc_t A, MORSE_desc_t T, MORSE_desc_t D,
                          MORSE_sequence_t *sequence, MORSE_request_t *request)
 {
     int k;
     int tempkm, tempkn;
-    MORSE_desc_t D;
     if (A.m >= A.n){
        for (k = 0; k < A.nt; k++) {
            tempkm = k == A.mt-1 ? A.m-k*A.mb : A.mb;
diff --git a/compute/zgesvd.c b/compute/zgesvd.c
index 1f312e2204d62f914f5a5ef3719538c460fcf722..4aea26f51876378bf7435b626237f9c3f31afe1f 100644
--- a/compute/zgesvd.c
+++ b/compute/zgesvd.c
@@ -460,9 +460,14 @@ int MORSE_zgesvd_Tile_Async(MORSE_enum jobu, MORSE_enum jobvt,
     NB    = descA.mb;
     LDAB  = NB + 1;
     uplo  = M >= N ? MorseUpper : MorseLower;
-
+#if defined(CHAMELEON_COPY_DIAG)
+    {
+        morse_zdesc_alloc(D, A->mb, A->nb, A->m, A->n, 0, 0, A->m, A->n, );
+        Dptr = &D;
+    }
+#endif
     /* Reduction to band */
-    morse_pzgebrd_ge2gb( descA, descT,
+    morse_pzgebrd_ge2gb( descA, descT, D,
                          sequence, request );
 
     /* Allocate band structure */
@@ -552,14 +557,6 @@ int MORSE_zgesvd_Tile_Async(MORSE_enum jobu, MORSE_enum jobvt,
     subT = NULL;
     subUVT = NULL;
     if ( jobu != MorseNoVec ) {
-#if defined(CHAMELEON_COPY_DIAG)
-    {
-        int n = chameleon_min(A->mt, A->nt) * A->nb;
-        morse_zdesc_alloc(D, A->mb, A->nb, A->m, n, 0, 0, A->m, n, );
-        Dptr = &D;
-    }
-#endif
-
         if ( M < N ){
             subA   = morse_desc_submatrix(&descA, descA.mb, 0, descA.m-descA.mb, descA.n-descA.nb);
             subUVT = morse_desc_submatrix(&descU, descU.mb, 0, descU.m-descU.mb, descU.n);
@@ -576,14 +573,7 @@ int MORSE_zgesvd_Tile_Async(MORSE_enum jobu, MORSE_enum jobvt,
     }
 
     if ( jobvt != MorseNoVec ) {
-#if defined(CHAMELEON_COPY_DIAG)
-    {
-        int m = chameleon_min(A->mt, A->nt) * A->mb;
-        morse_zdesc_alloc(D, A->mb, A->nb, m, A->n, 0, 0, m, A->n, );
-        Dptr = &D;
-    }
-#endif
-    if ( M < N ){
+        if ( M < N ){
             morse_pzunmlq( MorseRight, MorseNoTrans,
                            &descA, &descVT, &descT, Dptr,
                            sequence, request );