Invalid fold-funs can lead to memory leaks in EMM
Bugzilla Link | 43 |
Created on | Aug 08, 2004 14:28 |
Resolution | FIXED |
Resolved on | Aug 08, 2004 15:52 |
Version | 1.00beta |
OS | SunOS |
Architecture | Sun |
Attachments | leak.sac |
Extended Description
In the livermore-loops examples, often the following fold function is used: inline int[.] second( int[.] a, int[.] b) { return(b); } Using this fold function allows to abuse the fold-withloop as some kind of iteration construct. Unfortunately this will lead to memory leak if accumulation is made explicit. Have a look at the following example: inline int[.] second( int[.] a, int[.] b) { res = b; return(res); } int[.] f( int[.] iv, int[.] A) { return( A); } int main() { A = with (. <= iv <= .) genarray( [1024], 1); n = with (. <= iv <= .) genarray( [1024], 0); F = with ([0] <= iv < [10]) fold ( second, n, f(iv,A)); return( F[[0]]); } After b14 the fold withloop looks like this: F = with ( _flat_6_iv ) (_flat_4 <= _flat_6_iv=[_type_12] < _flat_5) { _ea_15_F = accu( _flat_6_iv); _flat_7 = _MAIN:f( _flat_6_iv, A); _ea_16__flat_7 = _FOLD:_type_13__MAIN__second( _ea_15_F, _flat_7); } : _ea_16__flat_7 ; fold/*fun*/( _FOLD:_type_13__MAIN__second, n); After inlining the fold function we get: F = with ( _flat_6_iv ) (_flat_4 <= _flat_6_iv=[_type_12] < _flat_5) { _ea_15_F = accu( _flat_6_iv); _flat_7 = _MAIN:f( _flat_6_iv, A); _inl_20__flat_7 = _flat_7; _inl_19_F = _ea_15_F; _inl_23_b = _inl_20__flat_7; _inl_22_a = _inl_19_F; _inl_21_res = _inl_23_b; _inl_17__type_14_F = _inl_21_res; _inl_18_F__SSA0_1 = _inl_17__type_14_F; _ea_16__flat_7 = _inl_18_F__SSA0_1; } : _ea_16__flat_7 ; fold/*fun*/( _FOLD:_type_13__MAIN__second, n); And finally, after the first application of DCR we obtain: F = with ( _flat_6_iv ) ([ 0 ] <= _flat_6_iv=[_type_12] < [ 10 ]) { _flat_7 = _MAIN:f( _flat_6_iv, A); } : _flat_7 ; fold/*fun*/( _FOLD:_type_13__MAIN__second, n); This seems to be a great optimization result, but unfortunately, we lost the handle to the last intermediate fold result which was represented by accu().
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information