Fix segfault in ?GELSS when NRHS is zero (Reference-LAPACK PR 876)tags/v0.3.24
| @@ -170,7 +170,7 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \ingroup complexGEsolve | |||||
| *> \ingroup gelss | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| SUBROUTINE CGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | SUBROUTINE CGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | ||||
| @@ -214,8 +214,7 @@ | |||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL CBDSQR, CCOPY, CGEBRD, CGELQF, CGEMM, CGEMV, | EXTERNAL CBDSQR, CCOPY, CGEBRD, CGELQF, CGEMM, CGEMV, | ||||
| $ CGEQRF, CLACPY, CLASCL, CLASET, CSRSCL, CUNGBR, | $ CGEQRF, CLACPY, CLASCL, CLASET, CSRSCL, CUNGBR, | ||||
| $ CUNMBR, CUNMLQ, CUNMQR, SLABAD, SLASCL, SLASET, | |||||
| $ XERBLA | |||||
| $ CUNMBR, CUNMLQ, CUNMQR, SLASCL, SLASET, XERBLA | |||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| INTEGER ILAENV | INTEGER ILAENV | ||||
| @@ -388,7 +387,6 @@ | |||||
| SFMIN = SLAMCH( 'S' ) | SFMIN = SLAMCH( 'S' ) | ||||
| SMLNUM = SFMIN / EPS | SMLNUM = SFMIN / EPS | ||||
| BIGNUM = ONE / SMLNUM | BIGNUM = ONE / SMLNUM | ||||
| CALL SLABAD( SMLNUM, BIGNUM ) | |||||
| * | * | ||||
| * Scale A if max element outside range [SMLNUM,BIGNUM] | * Scale A if max element outside range [SMLNUM,BIGNUM] | ||||
| * | * | ||||
| @@ -540,7 +538,7 @@ | |||||
| $ LDB, CZERO, WORK, N ) | $ LDB, CZERO, WORK, N ) | ||||
| CALL CLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | CALL CLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 20 CONTINUE | 20 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL CGEMV( 'C', N, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | CALL CGEMV( 'C', N, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | ||||
| CALL CCOPY( N, WORK, 1, B, 1 ) | CALL CCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -645,7 +643,7 @@ | |||||
| CALL CLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | CALL CLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | ||||
| $ LDB ) | $ LDB ) | ||||
| 40 CONTINUE | 40 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL CGEMV( 'C', M, M, CONE, WORK( IL ), LDWORK, B( 1, 1 ), | CALL CGEMV( 'C', M, M, CONE, WORK( IL ), LDWORK, B( 1, 1 ), | ||||
| $ 1, CZERO, WORK( IWORK ), 1 ) | $ 1, CZERO, WORK( IWORK ), 1 ) | ||||
| CALL CCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | CALL CCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | ||||
| @@ -737,7 +735,7 @@ | |||||
| $ LDB, CZERO, WORK, N ) | $ LDB, CZERO, WORK, N ) | ||||
| CALL CLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | CALL CLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 60 CONTINUE | 60 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL CGEMV( 'C', M, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | CALL CGEMV( 'C', M, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | ||||
| CALL CCOPY( N, WORK, 1, B, 1 ) | CALL CCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -164,7 +164,7 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \ingroup doubleGEsolve | |||||
| *> \ingroup gelss | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | SUBROUTINE DGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | ||||
| @@ -203,7 +203,7 @@ | |||||
| * .. | * .. | ||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL DBDSQR, DCOPY, DGEBRD, DGELQF, DGEMM, DGEMV, | EXTERNAL DBDSQR, DCOPY, DGEBRD, DGELQF, DGEMM, DGEMV, | ||||
| $ DGEQRF, DLABAD, DLACPY, DLASCL, DLASET, DORGBR, | |||||
| $ DGEQRF, DLACPY, DLASCL, DLASET, DORGBR, | |||||
| $ DORMBR, DORMLQ, DORMQR, DRSCL, XERBLA | $ DORMBR, DORMLQ, DORMQR, DRSCL, XERBLA | ||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| @@ -385,7 +385,6 @@ | |||||
| SFMIN = DLAMCH( 'S' ) | SFMIN = DLAMCH( 'S' ) | ||||
| SMLNUM = SFMIN / EPS | SMLNUM = SFMIN / EPS | ||||
| BIGNUM = ONE / SMLNUM | BIGNUM = ONE / SMLNUM | ||||
| CALL DLABAD( SMLNUM, BIGNUM ) | |||||
| * | * | ||||
| * Scale A if max element outside range [SMLNUM,BIGNUM] | * Scale A if max element outside range [SMLNUM,BIGNUM] | ||||
| * | * | ||||
| @@ -529,7 +528,7 @@ | |||||
| $ LDB, ZERO, WORK, N ) | $ LDB, ZERO, WORK, N ) | ||||
| CALL DLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | CALL DLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 20 CONTINUE | 20 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL DGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | CALL DGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | ||||
| CALL DCOPY( N, WORK, 1, B, 1 ) | CALL DCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -626,7 +625,7 @@ | |||||
| CALL DLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | CALL DLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | ||||
| $ LDB ) | $ LDB ) | ||||
| 40 CONTINUE | 40 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL DGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ), | CALL DGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ), | ||||
| $ 1, ZERO, WORK( IWORK ), 1 ) | $ 1, ZERO, WORK( IWORK ), 1 ) | ||||
| CALL DCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | CALL DCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | ||||
| @@ -712,7 +711,7 @@ | |||||
| $ LDB, ZERO, WORK, N ) | $ LDB, ZERO, WORK, N ) | ||||
| CALL DLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | CALL DLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 60 CONTINUE | 60 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL DGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | CALL DGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | ||||
| CALL DCOPY( N, WORK, 1, B, 1 ) | CALL DCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -164,7 +164,7 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \ingroup realGEsolve | |||||
| *> \ingroup gelss | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| SUBROUTINE SGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | SUBROUTINE SGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | ||||
| @@ -202,7 +202,7 @@ | |||||
| * .. | * .. | ||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL SBDSQR, SCOPY, SGEBRD, SGELQF, SGEMM, SGEMV, | EXTERNAL SBDSQR, SCOPY, SGEBRD, SGELQF, SGEMM, SGEMV, | ||||
| $ SGEQRF, SLABAD, SLACPY, SLASCL, SLASET, SORGBR, | |||||
| $ SGEQRF, SLACPY, SLASCL, SLASET, SORGBR, | |||||
| $ SORMBR, SORMLQ, SORMQR, SRSCL, XERBLA | $ SORMBR, SORMLQ, SORMQR, SRSCL, XERBLA | ||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| @@ -381,7 +381,6 @@ | |||||
| SFMIN = SLAMCH( 'S' ) | SFMIN = SLAMCH( 'S' ) | ||||
| SMLNUM = SFMIN / EPS | SMLNUM = SFMIN / EPS | ||||
| BIGNUM = ONE / SMLNUM | BIGNUM = ONE / SMLNUM | ||||
| CALL SLABAD( SMLNUM, BIGNUM ) | |||||
| * | * | ||||
| * Scale A if max element outside range [SMLNUM,BIGNUM] | * Scale A if max element outside range [SMLNUM,BIGNUM] | ||||
| * | * | ||||
| @@ -525,7 +524,7 @@ | |||||
| $ LDB, ZERO, WORK, N ) | $ LDB, ZERO, WORK, N ) | ||||
| CALL SLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | CALL SLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 20 CONTINUE | 20 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL SGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | CALL SGEMV( 'T', N, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | ||||
| CALL SCOPY( N, WORK, 1, B, 1 ) | CALL SCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -622,7 +621,7 @@ | |||||
| CALL SLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | CALL SLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | ||||
| $ LDB ) | $ LDB ) | ||||
| 40 CONTINUE | 40 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL SGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ), | CALL SGEMV( 'T', M, M, ONE, WORK( IL ), LDWORK, B( 1, 1 ), | ||||
| $ 1, ZERO, WORK( IWORK ), 1 ) | $ 1, ZERO, WORK( IWORK ), 1 ) | ||||
| CALL SCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | CALL SCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | ||||
| @@ -708,7 +707,7 @@ | |||||
| $ LDB, ZERO, WORK, N ) | $ LDB, ZERO, WORK, N ) | ||||
| CALL SLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | CALL SLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 60 CONTINUE | 60 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL SGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | CALL SGEMV( 'T', M, N, ONE, A, LDA, B, 1, ZERO, WORK, 1 ) | ||||
| CALL SCOPY( N, WORK, 1, B, 1 ) | CALL SCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -170,7 +170,7 @@ | |||||
| *> \author Univ. of Colorado Denver | *> \author Univ. of Colorado Denver | ||||
| *> \author NAG Ltd. | *> \author NAG Ltd. | ||||
| * | * | ||||
| *> \ingroup complex16GEsolve | |||||
| *> \ingroup gelss | |||||
| * | * | ||||
| * ===================================================================== | * ===================================================================== | ||||
| SUBROUTINE ZGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | SUBROUTINE ZGELSS( M, N, NRHS, A, LDA, B, LDB, S, RCOND, RANK, | ||||
| @@ -212,10 +212,9 @@ | |||||
| COMPLEX*16 DUM( 1 ) | COMPLEX*16 DUM( 1 ) | ||||
| * .. | * .. | ||||
| * .. External Subroutines .. | * .. External Subroutines .. | ||||
| EXTERNAL DLABAD, DLASCL, DLASET, XERBLA, ZBDSQR, ZCOPY, | |||||
| $ ZDRSCL, ZGEBRD, ZGELQF, ZGEMM, ZGEMV, ZGEQRF, | |||||
| $ ZLACPY, ZLASCL, ZLASET, ZUNGBR, ZUNMBR, ZUNMLQ, | |||||
| $ ZUNMQR | |||||
| EXTERNAL DLASCL, DLASET, XERBLA, ZBDSQR, ZCOPY, ZDRSCL, | |||||
| $ ZGEBRD, ZGELQF, ZGEMM, ZGEMV, ZGEQRF, ZLACPY, | |||||
| $ ZLASCL, ZLASET, ZUNGBR, ZUNMBR, ZUNMLQ | |||||
| * .. | * .. | ||||
| * .. External Functions .. | * .. External Functions .. | ||||
| INTEGER ILAENV | INTEGER ILAENV | ||||
| @@ -388,7 +387,6 @@ | |||||
| SFMIN = DLAMCH( 'S' ) | SFMIN = DLAMCH( 'S' ) | ||||
| SMLNUM = SFMIN / EPS | SMLNUM = SFMIN / EPS | ||||
| BIGNUM = ONE / SMLNUM | BIGNUM = ONE / SMLNUM | ||||
| CALL DLABAD( SMLNUM, BIGNUM ) | |||||
| * | * | ||||
| * Scale A if max element outside range [SMLNUM,BIGNUM] | * Scale A if max element outside range [SMLNUM,BIGNUM] | ||||
| * | * | ||||
| @@ -540,7 +538,7 @@ | |||||
| $ LDB, CZERO, WORK, N ) | $ LDB, CZERO, WORK, N ) | ||||
| CALL ZLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | CALL ZLACPY( 'G', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 20 CONTINUE | 20 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL ZGEMV( 'C', N, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | CALL ZGEMV( 'C', N, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | ||||
| CALL ZCOPY( N, WORK, 1, B, 1 ) | CALL ZCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||
| @@ -645,7 +643,7 @@ | |||||
| CALL ZLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | CALL ZLACPY( 'G', M, BL, WORK( IWORK ), M, B( 1, I ), | ||||
| $ LDB ) | $ LDB ) | ||||
| 40 CONTINUE | 40 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL ZGEMV( 'C', M, M, CONE, WORK( IL ), LDWORK, B( 1, 1 ), | CALL ZGEMV( 'C', M, M, CONE, WORK( IL ), LDWORK, B( 1, 1 ), | ||||
| $ 1, CZERO, WORK( IWORK ), 1 ) | $ 1, CZERO, WORK( IWORK ), 1 ) | ||||
| CALL ZCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | CALL ZCOPY( M, WORK( IWORK ), 1, B( 1, 1 ), 1 ) | ||||
| @@ -737,7 +735,7 @@ | |||||
| $ LDB, CZERO, WORK, N ) | $ LDB, CZERO, WORK, N ) | ||||
| CALL ZLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | CALL ZLACPY( 'F', N, BL, WORK, N, B( 1, I ), LDB ) | ||||
| 60 CONTINUE | 60 CONTINUE | ||||
| ELSE | |||||
| ELSE IF( NRHS.EQ.1 ) THEN | |||||
| CALL ZGEMV( 'C', M, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | CALL ZGEMV( 'C', M, N, CONE, A, LDA, B, 1, CZERO, WORK, 1 ) | ||||
| CALL ZCOPY( N, WORK, 1, B, 1 ) | CALL ZCOPY( N, WORK, 1, B, 1 ) | ||||
| END IF | END IF | ||||