------- Comment #27 from dominiq at lps dot ens dot fr 2010-05-09 14:19 -------
> VEC_safe_push is quite safe, actually. But it may re-allocate the VEC. If you
> really believe that VEC_safe_push is the problem here, then you should perhaps
> look if a VEC is being passed around incorrectly somewhere, so that
> reallocating it would make things disappear.
Could you give me more precise idea about what I am supposed to do to "look if
a VEC is being passed around incorrectly somewhere"? BTW I would think the
problem is not before some "reallocation", but after it, see:
... . The latter will reallocate the
vector, if needed. Reallocation causes an exponential increase in
vector size. ....
I have found a long comment at the beginning of gcc/vec.h, is VEC_safe_push
documented elsewhere?
I have done the following changes in the subroutine s00009.f90:
(1)
--- s00009.f90 2010-04-18 22:04:36.000000000 +0200
+++ s00009_yy.f90 2010-05-09 15:19:43.000000000 +0200
@@ -45,6 +45,7 @@
& NDPdt , NDBsor , NHSor
DOUBLE PRECISION M , cc(22,2)
coef = 144.D+00/778.D+00
+ zzz = 1.0/VVFs
DO i = 2 , NC1
j = i - 1
ity = ITYp(i)
and I get the same assembly compared with the original one (for both revision
159105 and 159106).
(2)
--- s00009.f90 2010-04-18 22:04:36.000000000 +0200
+++ s00009_xx.f90 2010-05-09 15:22:25.000000000 +0200
@@ -45,6 +45,7 @@
& NDPdt , NDBsor , NHSor
DOUBLE PRECISION M , cc(22,2)
coef = 144.D+00/778.D+00
+ zzz = 1.0/VVFs
DO i = 2 , NC1
j = i - 1
ity = ITYp(i)
@@ -76,7 +77,7 @@
AA(i,k) = VV(i,k)*DM(i,k) + DVVh(i,k)*cc(i,k)
DV(i,k) = AA(i,k) + BB(i,k)*DPDt
IF ( DABS(DV(i,k)).LT.1.D-10 ) DV(i,k) = 0.D+00
- epsm = DELm*VC(i)/VVFs
+ epsm = DELm*VC(i)*zzz
ym = M(i,k)
IF ( ym.LT.epsm ) ym = epsm
DH(i,k) = (cc(i,k)+coef*V(i,k)*DPDt)/ym
i.e., I have replaced the division with the multiplication by the inverse (if I
am not mistaken, this optimization is done with revision 159105 but not with
159106). The assembly is very different and the executable does not crash.
--
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43716