Add early returns
authorMartin Kroeker <martin@ruby.chemie.uni-freiburg.de>
Thu, 27 Aug 2020 09:22:50 +0000 (11:22 +0200)
committerGitHub <noreply@github.com>
Thu, 27 Aug 2020 09:22:50 +0000 (11:22 +0200)
relapack/src/sgetrf.c
relapack/src/ssytrf.c
relapack/src/ssytrf_rook.c
relapack/src/strsyl.c

index 0231cc1..a0c7015 100644 (file)
@@ -14,7 +14,6 @@ void RELAPACK_sgetrf(
     float *A, const blasint *ldA, blasint *ipiv,
     blasint *info
 ) {
-
     // Check arguments
     *info = 0;
     if (*m < 0)
@@ -28,6 +27,9 @@ void RELAPACK_sgetrf(
         LAPACK(xerbla)("SGETRF", &minfo, strlen("SGETRF"));
         return;
     }
+
+    if (*m == 0 || *n == 0) return;
+
     const blasint sn = MIN(*m, *n);
     RELAPACK_sgetrf_rec(m, &sn, A, ldA, ipiv, info);
 
@@ -35,7 +37,7 @@ void RELAPACK_sgetrf(
     if (*m < *n) {
         // Constants
         const float ONE[] = { 1. };
-        const blasint  iONE[] = { 1. };
+        const blasint  iONE[] = { 1 };
 
         // Splitting
         const blasint rn = *n - *m;
@@ -58,9 +60,12 @@ static void RELAPACK_sgetrf_rec(
     float *A, const blasint *ldA, blasint *ipiv,
     blasint *info
 ) {
-    if (*n <= MAX(CROSSOVER_SGETRF, 1)) {
+
+    if (*m == 0 || *n == 0) return;
+
+    if ( *n <= MAX(CROSSOVER_SGETRF, 1)) {
         // Unblocked
-        LAPACK(sgetf2)(m, n, A, ldA, ipiv, info);
+        LAPACK(sgetrf2)(m, n, A, ldA, ipiv, info);
         return;
     }
 
@@ -91,6 +96,8 @@ static void RELAPACK_sgetrf_rec(
 
     // recursion(A_L, ipiv_T)
     RELAPACK_sgetrf_rec(m, &n1, A_L, ldA, ipiv_T, info);
+    if (*info)
+       return;
     // apply pivots to A_R
     LAPACK(slaswp)(&n2, A_R, ldA, iONE, &n1, ipiv_T, iONE);
 
index 9fe7ce4..5f8e033 100644 (file)
@@ -35,7 +35,7 @@ void RELAPACK_ssytrf(
         *info = -2;
     else if (*ldA < MAX(1, *n))
         *info = -4;
-    else if (*lWork < minlWork && *lWork != -1)
+    else if ((*lWork <1 || *lWork < minlWork) && *lWork != -1)
         *info = -7;
     else if (*lWork == -1) {
         // Work size query
@@ -66,6 +66,7 @@ void RELAPACK_ssytrf(
     blasint nout;
 
     // Recursive kernel
+if (*n != 0)
     RELAPACK_ssytrf_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info);
 
 #if XSYTRF_ALLOW_MALLOC
index abcf29d..b40f122 100644 (file)
@@ -36,7 +36,7 @@ void RELAPACK_ssytrf_rook(
         *info = -2;
     else if (*ldA < MAX(1, *n))
         *info = -4;
-    else if (*lWork < minlWork && *lWork != -1)
+    else if ((*lWork < 1 ||*lWork < minlWork) && *lWork != -1)
         *info = -7;
     else if (*lWork == -1) {
         // Work size query
@@ -56,7 +56,7 @@ void RELAPACK_ssytrf_rook(
 
     if (*info) {
         const blasint minfo = -*info;
-        LAPACK(xerbla)("SSYTRF", &minfo, strlen("SSYTRF"));
+        LAPACK(xerbla)("SSYTRF_ROOK", &minfo, strlen("SSYTRF_ROOK"));
         return;
     }
 
@@ -67,6 +67,7 @@ void RELAPACK_ssytrf_rook(
     blasint nout;
 
     // Recursive kernel
+if (*n != 0)
     RELAPACK_ssytrf_rook_rec(&cleanuplo, n, n, &nout, A, ldA, ipiv, cleanWork, n, info);
 
 #if XSYTRF_ALLOW_MALLOC
index 012fb35..d85963f 100644 (file)
@@ -49,6 +49,11 @@ void RELAPACK_strsyl(
         return;
     }
 
+    if (*m == 0 || *n == 0) {
+        *scale = 1.;
+        return;
+    }
+
     // Clean char * arguments
     const char cleantranA = notransA ? 'N' : (transA ? 'T' : 'C');
     const char cleantranB = notransB ? 'N' : (transB ? 'T' : 'C');