tweak the totally-bogus arbitrary stack-squeezing heuristic to fix #2797
authorSimon Marlow <marlowsd@gmail.com>
Thu, 28 Jan 2010 12:44:54 +0000 (12:44 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 28 Jan 2010 12:44:54 +0000 (12:44 +0000)
In #2797, a program that ran in constant stack space when compiled
needed linear stack space when interpreted.  It turned out to be
nothing more than stack-squeezing not happening.  We have a heuristic
to avoid stack-squeezing when it would be too expensive (shuffling a
large amount of memory to save a few words), but in some cases even
expensive stack-squeezing is necessary to avoid linear stack usage.
One day we should implement stack chunks, which would make this less
expensive.

rts/ThreadPaused.c

index 93ec960..75712b0 100644 (file)
@@ -315,7 +315,8 @@ end:
     // the number of words we have to shift down is less than the
     // number of stack words we squeeze away by doing so.
     if (RtsFlags.GcFlags.squeezeUpdFrames == rtsTrue &&
-       ((weight <= 5 && words_to_squeeze > 0) || weight < words_to_squeeze)) {
+       ((weight <= 8 && words_to_squeeze > 0) || weight < words_to_squeeze)) {
+        // threshold above bumped from 5 to 8 as a result of #2797
        stackSqueeze(cap, tso, (StgPtr)frame);
         tso->flags |= TSO_SQUEEZED;
         // This flag tells threadStackOverflow() that the stack was