From ae8a72c0da76a9dd2786cce774c3d1d5b536a628 Mon Sep 17 00:00:00 2001
From: Piotr Luszczek <luszczek@icl.utk.edu>
Date: Mon, 23 Dec 2019 14:06:29 -0500
Subject: [PATCH] netlib-scalapack: Add int overflow patch (#14276)

---
 .../netlib-scalapack/int_overflow.patch       | 313 ++++++++++++++++++
 .../packages/netlib-scalapack/package.py      |   2 +
 2 files changed, 315 insertions(+)
 create mode 100644 var/spack/repos/builtin/packages/netlib-scalapack/int_overflow.patch

diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/int_overflow.patch b/var/spack/repos/builtin/packages/netlib-scalapack/int_overflow.patch
new file mode 100644
index 0000000000..b407fc840f
--- /dev/null
+++ b/var/spack/repos/builtin/packages/netlib-scalapack/int_overflow.patch
@@ -0,0 +1,313 @@
+diff --git a/PBLAS/SRC/pdamax_.c b/PBLAS/SRC/pdamax_.c
+index 3f4690a..89d8993 100644
+--- a/PBLAS/SRC/pdamax_.c
++++ b/PBLAS/SRC/pdamax_.c
+@@ -233,7 +233,7 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
+       if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
+           ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
+       {
+-         *INDX = *JX; *AMAX = X[Xii+Xjj*Xd[LLD_]];
++         *INDX = *JX; *AMAX = *Mptr(X,Xii,Xjj,Xd[LLD_],1);
+       }
+       return;
+    }
+@@ -260,9 +260,9 @@ void pdamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
+             {
+                Xld = Xd[LLD_];
+                Xlindx = Xjj - 1 +
+-                        idamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
++                        idamax_( &Xnq, ((char*)Mptr(X,Xii,Xjj,Xld,1)), &Xld );
+                Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
+-               work[0] = X[Xii+Xlindx*Xld];
++               work[0] = *Mptr(X,Xii,Xlindx,Xld,1);
+                work[1] = ((double)( Xgindx+1 ));
+             }
+             else
+@@ -343,8 +343,8 @@ l_20:
+ */
+                Xld = Xd[LLD_];
+                Xlindx = Xjj - 1 +
+-                        idamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
+-               *AMAX = X[Xii+Xlindx*Xld];
++                        idamax_( &Xnq, ((char*)Mptr(X,Xii,Xjj,Xld,1)), &Xld );
++               *AMAX = *Mptr(X,Xii,Xlindx,Xld,1);
+             }
+             else
+             {
+@@ -419,9 +419,9 @@ l_20:
+             {
+                Xld     = Xd[LLD_];
+                Xlindx  = Xii - 1 +
+-                         idamax_( &Xnp, ((char*)(X+(Xii+Xjj*Xld))), INCX );
++                         idamax_( &Xnp, ((char*)Mptr(X,Xii,Xjj,Xld,1)), INCX );
+                Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
+-               work[0] = X[Xlindx+Xjj*Xld];
++               work[0] = *Mptr(X,Xlindx,Xjj,Xld,1);
+                work[1] = ((double)( Xgindx+1 ));
+             }
+             else
+@@ -503,8 +503,8 @@ l_40:
+ */
+                Xld = Xd[LLD_];
+                Xlindx = Xii - 1 +
+-                        idamax_( &Xnp, ((char*)(X+(Xii+Xjj*Xld))), INCX );
+-               *AMAX = X[Xlindx+Xjj*Xld];
++                        idamax_( &Xnp, ((char*)Mptr(X,Xii,Xjj,Xld,1)), INCX );
++               *AMAX = *Mptr(X,Xlindx,Xjj,Xld,1);
+             }
+             else
+             {
+diff --git a/PBLAS/SRC/pdasum_.c b/PBLAS/SRC/pdasum_.c
+index 5b9ce8b..3a56c23 100644
+--- a/PBLAS/SRC/pdasum_.c
++++ b/PBLAS/SRC/pdasum_.c
+@@ -225,7 +225,7 @@ void pdasum_( N, ASUM, X, IX, JX, DESCX, INCX )
+       if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
+           ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
+       {
+-         *ASUM = ABS( X[Xii+Xjj*Xd[LLD_]] );
++         *ASUM = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
+       }
+       return;
+    }
+@@ -243,7 +243,7 @@ void pdasum_( N, ASUM, X, IX, JX, DESCX, INCX )
+          if( Xnq > 0 )
+          {
+             Xld = Xd[LLD_];
+-            dvasum_( &Xnq, ((char *) ASUM), ((char *)( X+(Xii+Xjj*Xld) )),
++            dvasum_( &Xnq, ((char *) ASUM), ((char *)Mptr( X,Xii,Xjj,Xld,1 )),
+                      &Xld );
+          }
+ /*
+@@ -276,7 +276,7 @@ void pdasum_( N, ASUM, X, IX, JX, DESCX, INCX )
+          if( Xnp > 0 )
+          {
+             dvasum_( &Xnp, ((char *) ASUM),
+-                     ((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
++                     ((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
+          }
+ /*
+ *  If Xnp <= 0, ASUM is zero (see initialization above)
+diff --git a/PBLAS/SRC/pdger_.c b/PBLAS/SRC/pdger_.c
+index e84aa62..517a33c 100644
+--- a/PBLAS/SRC/pdger_.c
++++ b/PBLAS/SRC/pdger_.c
+@@ -286,7 +286,7 @@ void pdger_( M, N, ALPHA, X, IX, JX, DESCX, INCX, Y, IY, JY, DESCY,
+    if( ( Amp > 0 ) && ( Anq > 0 ) )
+    {
+       dger_( &Amp, &Anq, ((char *) ALPHA), XA, &ione, YA, &YAd[LLD_],
+-             ((char *) (A+(Aii+Ajj*Ald))), &Ald );
++             ((char *)Mptr(A,Aii,Ajj,Ald,1)), &Ald );
+    }
+    if( XAfr ) free( XA );
+    if( YAfr ) free( YA );
+diff --git a/PBLAS/SRC/pdnrm2_.c b/PBLAS/SRC/pdnrm2_.c
+index f5bfb1a..8e3bab9 100644
+--- a/PBLAS/SRC/pdnrm2_.c
++++ b/PBLAS/SRC/pdnrm2_.c
+@@ -224,7 +224,7 @@ void pdnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
+ */
+       if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
+           ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
+-         *NORM2 = ABS( X[Xii+Xjj*Xd[LLD_]] );
++         *NORM2 = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
+       return;
+    }
+    else if( *INCX == Xd[M_] )
+@@ -246,7 +246,7 @@ void pdnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
+          if( Xnq > 0 )
+          {
+             Xld  = Xd[LLD_];
+-            Xptr = X+(Xii+Xjj*Xld);
++            Xptr = Mptr(X,Xii,Xjj,Xld,1);
+ 
+             for( k = 0; k < Xnq; k++ )
+             {
+@@ -366,7 +366,7 @@ l_20:
+          Xnp = PB_Cnumroc( *N, Xi, Xd[IMB_], Xd[MB_], myrow, Xd[RSRC_], nprow );
+          if( Xnp > 0 )
+          {
+-            Xptr = X+(Xii+Xjj*Xd[LLD_]);
++            Xptr = Mptr(X,Xii,Xjj,Xd[LLD_],1);
+ 
+             for( k = 0; k < Xnp; k++ )
+             {
+diff --git a/PBLAS/SRC/pdscal_.c b/PBLAS/SRC/pdscal_.c
+index 28ddc66..b7c0964 100644
+--- a/PBLAS/SRC/pdscal_.c
++++ b/PBLAS/SRC/pdscal_.c
+@@ -210,12 +210,12 @@ void pdscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
+             Xld = Xd[LLD_];
+             if( ALPHA[REAL_PART] == ZERO )
+             {
+-               dset_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
++               dset_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
+                       &Xld );
+             }
+             else
+             {
+-               dscal_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
++               dscal_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
+                        &Xld );
+             }
+          }
+@@ -239,12 +239,12 @@ void pdscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
+             if( ALPHA[REAL_PART] == ZERO )
+             {
+                dset_( &Xnp, ((char *) ALPHA),
+-                      ((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
++                      ((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
+             }
+             else
+             {
+                dscal_( &Xnp, ((char *) ALPHA),
+-                       ((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
++                       ((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
+             }
+          }
+       }
+diff --git a/PBLAS/SRC/psamax_.c b/PBLAS/SRC/psamax_.c
+index a23b28a..8cdbd8e 100644
+--- a/PBLAS/SRC/psamax_.c
++++ b/PBLAS/SRC/psamax_.c
+@@ -260,7 +260,7 @@ void psamax_( N, AMAX, INDX, X, IX, JX, DESCX, INCX )
+             {
+                Xld = Xd[LLD_];
+                Xlindx = Xjj - 1 +
+-                        isamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
++                        isamax_( &Xnq, ((char*)(Mptr(X,Xii,Xjj,Xld,1))), &Xld );
+                Mindxl2g( Xgindx, Xlindx, Xinb, Xnb, mycol, Xsrc, npcol );
+                work[0] = X[Xii+Xlindx*Xld];
+                work[1] = ((float )( Xgindx+1 ));
+@@ -343,8 +343,8 @@ l_20:
+ */
+                Xld = Xd[LLD_];
+                Xlindx = Xjj - 1 +
+-                        isamax_( &Xnq, ((char*)(X+(Xii+Xjj*Xld))), &Xld );
+-               *AMAX = X[Xii+Xlindx*Xld];
++                        isamax_( &Xnq, ((char*)(Mptr(X,Xii,Xjj,Xld, 1))), &Xld );
++               *AMAX = *Mptr(X,Xii,Xlindx,Xld,1);
+             }
+             else
+             {
+@@ -419,9 +419,9 @@ l_20:
+             {
+                Xld     = Xd[LLD_];
+                Xlindx  = Xii - 1 +
+-                         isamax_( &Xnp, ((char*)(X+(Xii+Xjj*Xld))), INCX );
++                         isamax_( &Xnp, ((char*)Mptr(X,Xii,Xjj,Xld,1)), INCX );
+                Mindxl2g( Xgindx, Xlindx, Ximb, Xmb, myrow, Xsrc, nprow );
+-               work[0] = X[Xlindx+Xjj*Xld];
++               work[0] = *Mptr(X,Xlindx,Xjj,Xld,1);
+                work[1] = ((float )( Xgindx+1 ));
+             }
+             else
+diff --git a/PBLAS/SRC/psasum_.c b/PBLAS/SRC/psasum_.c
+index a9820b3..dd6dcf1 100644
+--- a/PBLAS/SRC/psasum_.c
++++ b/PBLAS/SRC/psasum_.c
+@@ -225,7 +225,7 @@ void psasum_( N, ASUM, X, IX, JX, DESCX, INCX )
+       if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
+           ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
+       {
+-         *ASUM = ABS( X[Xii+Xjj*Xd[LLD_]] );
++         *ASUM = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
+       }
+       return;
+    }
+@@ -243,7 +243,7 @@ void psasum_( N, ASUM, X, IX, JX, DESCX, INCX )
+          if( Xnq > 0 )
+          {
+             Xld = Xd[LLD_];
+-            svasum_( &Xnq, ((char *) ASUM), ((char *)( X+(Xii+Xjj*Xld) )),
++            svasum_( &Xnq, ((char *) ASUM), ((char *)Mptr( X,Xii,Xjj,Xld,1) ),
+                      &Xld );
+          }
+ /*
+@@ -276,7 +276,7 @@ void psasum_( N, ASUM, X, IX, JX, DESCX, INCX )
+          if( Xnp > 0 )
+          {
+             svasum_( &Xnp, ((char *) ASUM),
+-                     ((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
++                     ((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
+          }
+ /*
+ *  If Xnp <= 0, ASUM is zero (see initialization above)
+diff --git a/PBLAS/SRC/psger_.c b/PBLAS/SRC/psger_.c
+index f7774a4..47af5e5 100644
+--- a/PBLAS/SRC/psger_.c
++++ b/PBLAS/SRC/psger_.c
+@@ -286,7 +286,7 @@ void psger_( M, N, ALPHA, X, IX, JX, DESCX, INCX, Y, IY, JY, DESCY,
+    if( ( Amp > 0 ) && ( Anq > 0 ) )
+    {
+       sger_( &Amp, &Anq, ((char *) ALPHA), XA, &ione, YA, &YAd[LLD_],
+-             ((char *) (A+(Aii+Ajj*Ald))), &Ald );
++             ((char *)Mptr(A,Aii,Ajj,Ald,1)), &Ald );
+    }
+    if( XAfr ) free( XA );
+    if( YAfr ) free( YA );
+diff --git a/PBLAS/SRC/psnrm2_.c b/PBLAS/SRC/psnrm2_.c
+index ff047c2..05eb00b 100644
+--- a/PBLAS/SRC/psnrm2_.c
++++ b/PBLAS/SRC/psnrm2_.c
+@@ -224,7 +224,7 @@ void psnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
+ */
+       if( ( ( myrow == Xrow ) || ( Xrow < 0 ) ) &&
+           ( ( mycol == Xcol ) || ( Xcol < 0 ) ) )
+-         *NORM2 = ABS( X[Xii+Xjj*Xd[LLD_]] );
++         *NORM2 = ABS( *Mptr(X,Xii,Xjj,Xd[LLD_],1) );
+       return;
+    }
+    else if( *INCX == Xd[M_] )
+@@ -246,7 +246,7 @@ void psnrm2_( N, NORM2, X, IX, JX, DESCX, INCX )
+          if( Xnq > 0 )
+          {
+             Xld  = Xd[LLD_];
+-            Xptr = X+(Xii+Xjj*Xld);
++            Xptr = Mptr(X,Xii,Xjj,Xld,1);
+ 
+             for( k = 0; k < Xnq; k++ )
+             {
+@@ -366,7 +366,7 @@ l_20:
+          Xnp = PB_Cnumroc( *N, Xi, Xd[IMB_], Xd[MB_], myrow, Xd[RSRC_], nprow );
+          if( Xnp > 0 )
+          {
+-            Xptr = X+(Xii+Xjj*Xd[LLD_]);
++            Xptr = Mptr(X,Xii,Xjj,Xd[LLD_],1);
+ 
+             for( k = 0; k < Xnp; k++ )
+             {
+diff --git a/PBLAS/SRC/psscal_.c b/PBLAS/SRC/psscal_.c
+index d3652e2..6eb6ee7 100644
+--- a/PBLAS/SRC/psscal_.c
++++ b/PBLAS/SRC/psscal_.c
+@@ -210,12 +210,12 @@ void psscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
+             Xld = Xd[LLD_];
+             if( ALPHA[REAL_PART] == ZERO )
+             {
+-               sset_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
++               sset_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
+                       &Xld );
+             }
+             else
+             {
+-               sscal_( &Xnq, ((char *) ALPHA), ((char *)(X+(Xii+Xjj*Xld))),
++               sscal_( &Xnq, ((char *) ALPHA), ((char *)Mptr(X,Xii,Xjj,Xld,1)),
+                        &Xld );
+             }
+          }
+@@ -239,12 +239,12 @@ void psscal_( N, ALPHA, X, IX, JX, DESCX, INCX )
+             if( ALPHA[REAL_PART] == ZERO )
+             {
+                sset_( &Xnp, ((char *) ALPHA),
+-                      ((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
++                      ((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1) ), INCX );
+             }
+             else
+             {
+                sscal_( &Xnp, ((char *) ALPHA),
+-                       ((char *)( X+(Xii+Xjj*Xd[LLD_]) )), INCX );
++                       ((char *)Mptr( X,Xii,Xjj,Xd[LLD_],1 )), INCX );
+             }
+          }
+       }
diff --git a/var/spack/repos/builtin/packages/netlib-scalapack/package.py b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
index 41f7431234..5841d25c6a 100644
--- a/var/spack/repos/builtin/packages/netlib-scalapack/package.py
+++ b/var/spack/repos/builtin/packages/netlib-scalapack/package.py
@@ -44,6 +44,8 @@ class NetlibScalapack(CMakePackage):
     patch("cmake_fortran_mangle.patch", when='@2.0.2:@2.0.99')
     # See: https://github.com/Reference-ScaLAPACK/scalapack/pull/10
     patch("mpi2-compatibility.patch", when='@2.0.2:@2.0.99')
+    # See: https://github.com/Reference-ScaLAPACK/scalapack/pull/16
+    patch("int_overflow.patch", when='@2.0.0:@2.1.0')
 
     @property
     def libs(self):
-- 
GitLab