1 Description: Fix {C,Z}GESVD stack corruption issue (upstream bug #114)
2 Origin: upstream, commit: r1455
3 Bug: http://icl.utk.edu/lapack-forum/viewtopic.php?f=13&t=4392
4 Reviewed-by: Sébastien Villemot <sebastien@debian.org>
5 Last-Update: 2014-08-07
7 This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
12 MNTHR = ILAENV( 6, 'CGESVD', JOBU // JOBVT, M, N, 0, 0 )
13 * Compute space needed for CGEQRF
14 - CALL CGEQRF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
16 + CALL CGEQRF( M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
17 + LWORK_CGEQRF=CDUM(1)
18 * Compute space needed for CUNGQR
19 - CALL CUNGQR( M, N, N, A, LDA, DUM(1), DUM(1), -1, IERR )
20 - LWORK_CUNGQR_N=DUM(1)
21 - CALL CUNGQR( M, M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
22 - LWORK_CUNGQR_M=DUM(1)
23 + CALL CUNGQR( M, N, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
24 + LWORK_CUNGQR_N=CDUM(1)
25 + CALL CUNGQR( M, M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
26 + LWORK_CUNGQR_M=CDUM(1)
27 * Compute space needed for CGEBRD
28 - CALL CGEBRD( N, N, A, LDA, S, DUM(1), DUM(1),
29 - $ DUM(1), DUM(1), -1, IERR )
31 + CALL CGEBRD( N, N, A, LDA, S, DUM(1), CDUM(1),
32 + $ CDUM(1), CDUM(1), -1, IERR )
33 + LWORK_CGEBRD=CDUM(1)
34 * Compute space needed for CUNGBR
35 - CALL CUNGBR( 'P', N, N, N, A, LDA, DUM(1),
36 - $ DUM(1), -1, IERR )
37 - LWORK_CUNGBR_P=DUM(1)
38 - CALL CUNGBR( 'Q', N, N, N, A, LDA, DUM(1),
39 - $ DUM(1), -1, IERR )
40 - LWORK_CUNGBR_Q=DUM(1)
41 + CALL CUNGBR( 'P', N, N, N, A, LDA, CDUM(1),
42 + $ CDUM(1), -1, IERR )
43 + LWORK_CUNGBR_P=CDUM(1)
44 + CALL CUNGBR( 'Q', N, N, N, A, LDA, CDUM(1),
45 + $ CDUM(1), -1, IERR )
46 + LWORK_CUNGBR_Q=CDUM(1)
48 MNTHR = ILAENV( 6, 'CGESVD', JOBU // JOBVT, M, N, 0, 0 )
52 * Path 10 (M at least N, but not much larger)
54 - CALL CGEBRD( M, N, A, LDA, S, DUM(1), DUM(1),
55 - $ DUM(1), DUM(1), -1, IERR )
57 + CALL CGEBRD( M, N, A, LDA, S, DUM(1), CDUM(1),
58 + $ CDUM(1), CDUM(1), -1, IERR )
59 + LWORK_CGEBRD=CDUM(1)
60 MAXWRK = 2*N + LWORK_CGEBRD
61 IF( WNTUS .OR. WNTUO ) THEN
62 - CALL CUNGBR( 'Q', M, N, N, A, LDA, DUM(1),
63 - $ DUM(1), -1, IERR )
64 - LWORK_CUNGBR_Q=DUM(1)
65 + CALL CUNGBR( 'Q', M, N, N, A, LDA, CDUM(1),
66 + $ CDUM(1), -1, IERR )
67 + LWORK_CUNGBR_Q=CDUM(1)
68 MAXWRK = MAX( MAXWRK, 2*N+LWORK_CUNGBR_Q )
71 - CALL CUNGBR( 'Q', M, M, N, A, LDA, DUM(1),
72 - $ DUM(1), -1, IERR )
73 - LWORK_CUNGBR_Q=DUM(1)
74 + CALL CUNGBR( 'Q', M, M, N, A, LDA, CDUM(1),
75 + $ CDUM(1), -1, IERR )
76 + LWORK_CUNGBR_Q=CDUM(1)
77 MAXWRK = MAX( MAXWRK, 2*N+LWORK_CUNGBR_Q )
82 MNTHR = ILAENV( 6, 'CGESVD', JOBU // JOBVT, M, N, 0, 0 )
83 * Compute space needed for CGELQF
84 - CALL CGELQF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
86 + CALL CGELQF( M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
87 + LWORK_CGELQF=CDUM(1)
88 * Compute space needed for CUNGLQ
89 - CALL CUNGLQ( N, N, M, DUM(1), N, DUM(1), DUM(1), -1, IERR )
90 - LWORK_CUNGLQ_N=DUM(1)
91 - CALL CUNGLQ( M, N, M, A, LDA, DUM(1), DUM(1), -1, IERR )
92 - LWORK_CUNGLQ_M=DUM(1)
93 + CALL CUNGLQ( N, N, M, CDUM(1), N, CDUM(1), CDUM(1), -1,
95 + LWORK_CUNGLQ_N=CDUM(1)
96 + CALL CUNGLQ( M, N, M, A, LDA, CDUM(1), CDUM(1), -1, IERR )
97 + LWORK_CUNGLQ_M=CDUM(1)
98 * Compute space needed for CGEBRD
99 - CALL CGEBRD( M, M, A, LDA, S, DUM(1), DUM(1),
100 - $ DUM(1), DUM(1), -1, IERR )
101 - LWORK_CGEBRD=DUM(1)
102 + CALL CGEBRD( M, M, A, LDA, S, DUM(1), CDUM(1),
103 + $ CDUM(1), CDUM(1), -1, IERR )
104 + LWORK_CGEBRD=CDUM(1)
105 * Compute space needed for CUNGBR P
106 - CALL CUNGBR( 'P', M, M, M, A, N, DUM(1),
107 - $ DUM(1), -1, IERR )
108 - LWORK_CUNGBR_P=DUM(1)
109 + CALL CUNGBR( 'P', M, M, M, A, N, CDUM(1),
110 + $ CDUM(1), -1, IERR )
111 + LWORK_CUNGBR_P=CDUM(1)
112 * Compute space needed for CUNGBR Q
113 - CALL CUNGBR( 'Q', M, M, M, A, N, DUM(1),
114 - $ DUM(1), -1, IERR )
115 - LWORK_CUNGBR_Q=DUM(1)
116 + CALL CUNGBR( 'Q', M, M, M, A, N, CDUM(1),
117 + $ CDUM(1), -1, IERR )
118 + LWORK_CUNGBR_Q=CDUM(1)
119 IF( N.GE.MNTHR ) THEN
122 @@ -593,21 +594,21 @@
124 * Path 10t(N greater than M, but not much larger)
126 - CALL CGEBRD( M, N, A, LDA, S, DUM(1), DUM(1),
127 - $ DUM(1), DUM(1), -1, IERR )
128 - LWORK_CGEBRD=DUM(1)
129 + CALL CGEBRD( M, N, A, LDA, S, DUM(1), CDUM(1),
130 + $ CDUM(1), CDUM(1), -1, IERR )
131 + LWORK_CGEBRD=CDUM(1)
132 MAXWRK = 2*M + LWORK_CGEBRD
133 IF( WNTVS .OR. WNTVO ) THEN
134 * Compute space needed for CUNGBR P
135 - CALL CUNGBR( 'P', M, N, M, A, N, DUM(1),
136 - $ DUM(1), -1, IERR )
137 - LWORK_CUNGBR_P=DUM(1)
138 + CALL CUNGBR( 'P', M, N, M, A, N, CDUM(1),
139 + $ CDUM(1), -1, IERR )
140 + LWORK_CUNGBR_P=CDUM(1)
141 MAXWRK = MAX( MAXWRK, 2*M+LWORK_CUNGBR_P )
144 - CALL CUNGBR( 'P', N, N, M, A, N, DUM(1),
145 - $ DUM(1), -1, IERR )
146 - LWORK_CUNGBR_P=DUM(1)
147 + CALL CUNGBR( 'P', N, N, M, A, N, CDUM(1),
148 + $ CDUM(1), -1, IERR )
149 + LWORK_CUNGBR_P=CDUM(1)
150 MAXWRK = MAX( MAXWRK, 2*M+LWORK_CUNGBR_P )
152 IF( .NOT.WNTUN ) THEN
155 @@ -321,24 +321,24 @@
157 MNTHR = ILAENV( 6, 'ZGESVD', JOBU // JOBVT, M, N, 0, 0 )
158 * Compute space needed for ZGEQRF
159 - CALL ZGEQRF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
160 - LWORK_ZGEQRF=DUM(1)
161 + CALL ZGEQRF( M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
162 + LWORK_ZGEQRF=CDUM(1)
163 * Compute space needed for ZUNGQR
164 - CALL ZUNGQR( M, N, N, A, LDA, DUM(1), DUM(1), -1, IERR )
165 - LWORK_ZUNGQR_N=DUM(1)
166 - CALL ZUNGQR( M, M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
167 - LWORK_ZUNGQR_M=DUM(1)
168 + CALL ZUNGQR( M, N, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
169 + LWORK_ZUNGQR_N=CDUM(1)
170 + CALL ZUNGQR( M, M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
171 + LWORK_ZUNGQR_M=CDUM(1)
172 * Compute space needed for ZGEBRD
173 - CALL ZGEBRD( N, N, A, LDA, S, DUM(1), DUM(1),
174 - $ DUM(1), DUM(1), -1, IERR )
175 - LWORK_ZGEBRD=DUM(1)
176 + CALL ZGEBRD( N, N, A, LDA, S, DUM(1), CDUM(1),
177 + $ CDUM(1), CDUM(1), -1, IERR )
178 + LWORK_ZGEBRD=CDUM(1)
179 * Compute space needed for ZUNGBR
180 - CALL ZUNGBR( 'P', N, N, N, A, LDA, DUM(1),
181 - $ DUM(1), -1, IERR )
182 - LWORK_ZUNGBR_P=DUM(1)
183 - CALL ZUNGBR( 'Q', N, N, N, A, LDA, DUM(1),
184 - $ DUM(1), -1, IERR )
185 - LWORK_ZUNGBR_Q=DUM(1)
186 + CALL ZUNGBR( 'P', N, N, N, A, LDA, CDUM(1),
187 + $ CDUM(1), -1, IERR )
188 + LWORK_ZUNGBR_P=CDUM(1)
189 + CALL ZUNGBR( 'Q', N, N, N, A, LDA, CDUM(1),
190 + $ CDUM(1), -1, IERR )
191 + LWORK_ZUNGBR_Q=CDUM(1)
193 IF( M.GE.MNTHR ) THEN
195 @@ -443,20 +443,20 @@
197 * Path 10 (M at least N, but not much larger)
199 - CALL ZGEBRD( M, N, A, LDA, S, DUM(1), DUM(1),
200 - $ DUM(1), DUM(1), -1, IERR )
201 - LWORK_ZGEBRD=DUM(1)
202 + CALL ZGEBRD( M, N, A, LDA, S, DUM(1), CDUM(1),
203 + $ CDUM(1), CDUM(1), -1, IERR )
204 + LWORK_ZGEBRD=CDUM(1)
205 MAXWRK = 2*N + LWORK_ZGEBRD
206 IF( WNTUS .OR. WNTUO ) THEN
207 - CALL ZUNGBR( 'Q', M, N, N, A, LDA, DUM(1),
208 - $ DUM(1), -1, IERR )
209 - LWORK_ZUNGBR_Q=DUM(1)
210 + CALL ZUNGBR( 'Q', M, N, N, A, LDA, CDUM(1),
211 + $ CDUM(1), -1, IERR )
212 + LWORK_ZUNGBR_Q=CDUM(1)
213 MAXWRK = MAX( MAXWRK, 2*N+LWORK_ZUNGBR_Q )
216 - CALL ZUNGBR( 'Q', M, M, N, A, LDA, DUM(1),
217 - $ DUM(1), -1, IERR )
218 - LWORK_ZUNGBR_Q=DUM(1)
219 + CALL ZUNGBR( 'Q', M, M, N, A, LDA, CDUM(1),
220 + $ CDUM(1), -1, IERR )
221 + LWORK_ZUNGBR_Q=CDUM(1)
222 MAXWRK = MAX( MAXWRK, 2*N+LWORK_ZUNGBR_Q )
224 IF( .NOT.WNTVN ) THEN
225 @@ -470,25 +470,26 @@
227 MNTHR = ILAENV( 6, 'ZGESVD', JOBU // JOBVT, M, N, 0, 0 )
228 * Compute space needed for ZGELQF
229 - CALL ZGELQF( M, N, A, LDA, DUM(1), DUM(1), -1, IERR )
230 - LWORK_ZGELQF=DUM(1)
231 + CALL ZGELQF( M, N, A, LDA, CDUM(1), CDUM(1), -1, IERR )
232 + LWORK_ZGELQF=CDUM(1)
233 * Compute space needed for ZUNGLQ
234 - CALL ZUNGLQ( N, N, M, DUM(1), N, DUM(1), DUM(1), -1, IERR )
235 - LWORK_ZUNGLQ_N=DUM(1)
236 - CALL ZUNGLQ( M, N, M, A, LDA, DUM(1), DUM(1), -1, IERR )
237 - LWORK_ZUNGLQ_M=DUM(1)
238 + CALL ZUNGLQ( N, N, M, CDUM(1), N, CDUM(1), CDUM(1), -1,
240 + LWORK_ZUNGLQ_N=CDUM(1)
241 + CALL ZUNGLQ( M, N, M, A, LDA, CDUM(1), CDUM(1), -1, IERR )
242 + LWORK_ZUNGLQ_M=CDUM(1)
243 * Compute space needed for ZGEBRD
244 - CALL ZGEBRD( M, M, A, LDA, S, DUM(1), DUM(1),
245 - $ DUM(1), DUM(1), -1, IERR )
246 - LWORK_ZGEBRD=DUM(1)
247 + CALL ZGEBRD( M, M, A, LDA, S, DUM(1), CDUM(1),
248 + $ CDUM(1), CDUM(1), -1, IERR )
249 + LWORK_ZGEBRD=CDUM(1)
250 * Compute space needed for ZUNGBR P
251 - CALL ZUNGBR( 'P', M, M, M, A, N, DUM(1),
252 - $ DUM(1), -1, IERR )
253 - LWORK_ZUNGBR_P=DUM(1)
254 + CALL ZUNGBR( 'P', M, M, M, A, N, CDUM(1),
255 + $ CDUM(1), -1, IERR )
256 + LWORK_ZUNGBR_P=CDUM(1)
257 * Compute space needed for ZUNGBR Q
258 - CALL ZUNGBR( 'Q', M, M, M, A, N, DUM(1),
259 - $ DUM(1), -1, IERR )
260 - LWORK_ZUNGBR_Q=DUM(1)
261 + CALL ZUNGBR( 'Q', M, M, M, A, N, CDUM(1),
262 + $ CDUM(1), -1, IERR )
263 + LWORK_ZUNGBR_Q=CDUM(1)
264 IF( N.GE.MNTHR ) THEN
267 @@ -592,21 +593,21 @@
269 * Path 10t(N greater than M, but not much larger)
271 - CALL ZGEBRD( M, N, A, LDA, S, DUM(1), DUM(1),
272 - $ DUM(1), DUM(1), -1, IERR )
273 - LWORK_ZGEBRD=DUM(1)
274 + CALL ZGEBRD( M, N, A, LDA, S, DUM(1), CDUM(1),
275 + $ CDUM(1), CDUM(1), -1, IERR )
276 + LWORK_ZGEBRD=CDUM(1)
277 MAXWRK = 2*M + LWORK_ZGEBRD
278 IF( WNTVS .OR. WNTVO ) THEN
279 * Compute space needed for ZUNGBR P
280 - CALL ZUNGBR( 'P', M, N, M, A, N, DUM(1),
281 - $ DUM(1), -1, IERR )
282 - LWORK_ZUNGBR_P=DUM(1)
283 + CALL ZUNGBR( 'P', M, N, M, A, N, CDUM(1),
284 + $ CDUM(1), -1, IERR )
285 + LWORK_ZUNGBR_P=CDUM(1)
286 MAXWRK = MAX( MAXWRK, 2*M+LWORK_ZUNGBR_P )
289 - CALL ZUNGBR( 'P', N, N, M, A, N, DUM(1),
290 - $ DUM(1), -1, IERR )
291 - LWORK_ZUNGBR_P=DUM(1)
292 + CALL ZUNGBR( 'P', N, N, M, A, N, CDUM(1),
293 + $ CDUM(1), -1, IERR )
294 + LWORK_ZUNGBR_P=CDUM(1)
295 MAXWRK = MAX( MAXWRK, 2*M+LWORK_ZUNGBR_P )
297 IF( .NOT.WNTUN ) THEN