From cc8bb92b4e0553dafd3f04f73bcab504dd535951 Mon Sep 17 00:00:00 2001
From: Mathieu Faverge <mathieu.faverge@inria.fr>
Date: Mon, 7 Nov 2016 19:25:28 +0100
Subject: [PATCH] duplicate the loop to avoid if at each iteration

---
 z_spm_expand.c | 93 ++++++++++++++++++++++++++++++++------------------
 1 file changed, 59 insertions(+), 34 deletions(-)

diff --git a/z_spm_expand.c b/z_spm_expand.c
index 7f77e5a8..d9d982de 100644
--- a/z_spm_expand.c
+++ b/z_spm_expand.c
@@ -24,7 +24,7 @@ pastix_spm_t *
 z_spmExpand(const pastix_spm_t *spm)
 {
     pastix_spm_t       *newspm;
-    pastix_int_t        i, j, k, ii, jj, dofi, dofj, col, row, baseval, cpt;
+    pastix_int_t        i, j, k, ii, jj, dof, dofi, dofj, col, row, baseval, cpt;
     pastix_int_t       *newcol, *newrow, *oldcol, *oldrow, *dofs;
 #if !defined(PRECISION_p)
     pastix_complex64_t *newval, *oldval;
@@ -64,54 +64,79 @@ z_spmExpand(const pastix_spm_t *spm)
         /**
          * Loop on col
          */
-        for(i=0; i<spm->n; i++)
-        {
-            if ( spm->dof > 0 ) {
-                col  = spm->dof * i;
-                dofi = spm->dof;
+        if ( spm->dof > 0 ) {
+            col = 0;
+            dof = spm->dof;
+
+            for(i=0; i<spm->n; i++, col+=dof)
+            {
+                for(ii=0; ii<dof; ii++, newcol++)
+                {
+                    /**
+                     * Loop on rows
+                     */
+                    for(k=oldcol[i]; k<oldcol[i+1]; k++, row+=dof)
+                    {
+                        j = oldrow[k-baseval]-baseval;
+
+                        for(jj=0; jj<dof; jj++, newrow++)
+                        {
+                            (*newcol)++;
+                            (*newrow) = row + jj + baseval;
+
+#if !defined(PRECISION_p)
+                            if ( (spm->mtxtype != PastixGeneral) &&
+                                 (row + jj < col + ii) )
+                            {
+                                (*newval) = oldval[ cpt ];
+                                newval++;
+                            }
+                            cpt++;
+#endif
+                        }
+                    }
+                    (*newcol) += baseval;
+                }
             }
-            else {
+        }
+        else {
+            for(i=0; i<spm->n; i++)
+            {
                 col  = dofs[i];
                 dofi = dofs[i+1] - dofs[i];
-            }
 
-            for(ii=0; ii<dofi; ii++, newcol++)
-            {
-                /**
-                 * Loop on rows
-                 */
-                for(k=oldcol[i]; k<oldcol[i+1]; k++)
+                for(ii=0; ii<dofi; ii++, newcol++)
                 {
-                    j = oldrow[k-baseval]-baseval;
-                    if ( spm->dof > 0 ) {
-                        row  = spm->dof * j;
-                        dofj = spm->dof;
-                    }
-                    else {
+                    /**
+                     * Loop on rows
+                     */
+                    for(k=oldcol[i]; k<oldcol[i+1]; k++)
+                    {
+                        j = oldrow[k-baseval]-baseval;
                         row  = dofs[j];
                         dofj = dofs[j+1] - dofs[j];
-                    }
 
-                    for(jj=0; jj<dofj; jj++, newrow++)
-                    {
-                        (*newcol)++;
-                        (*newrow) = row + jj + baseval;
+                        for(jj=0; jj<dofj; jj++, newrow++)
+                        {
+                            (*newcol)++;
+                            (*newrow) = row + jj + baseval;
 
 #if !defined(PRECISION_p)
-                        if ( (spm->mtxtype != PastixGeneral) &&
-                             (row + jj < col + ii) )
-                        {
-                            (*newval) = oldval[ cpt ];
-                            newval++;
-                        }
-                        cpt++;
+                            if ( (spm->mtxtype != PastixGeneral) &&
+                                 (row + jj < col + ii) )
+                            {
+                                (*newval) = oldval[ cpt ];
+                                newval++;
+                            }
+                            cpt++;
 #endif
+                        }
                     }
+                    (*newcol) += baseval;
                 }
-                (*newcol) += baseval;
             }
         }
-        break;
+    break;
     case PastixCSR:
     case PastixIJV:
         free( newspm );
-- 
GitLab