Skip to content

Optimizer creates stack overflow on filtered CAF

The following code creates a stack overflow at -O1 or -O2, when running with a moderately small stack (+RTS -K94k):

import Data.Bits
hmm :: [Integer]
hmm = filter (\n -> (n .&. (n-1))==0) [1..]
main = mapM_ print hmm

The lambda just picks out powers of two, so that filter will skip increasingly long subsequences. It's the filter causing the overflow.

Changing hmm to [Int], or to be let-bound, or compiling with -O0 makes the overflow go away. Using a 95k stack also makes the overflow go away. (Below 95k, stack usage is linear with the length of the filtered-out subsequence; then it seems to cap out.)

Edited by Ian Lynagh -
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information