<div dir="ltr"><div>Hello Cafe,</div><div><br></div><div>While investigating a performance problem I stumbled upon what I eventually reduced to the example below:</div><div><br></div><span style="font-family:monospace">module Main where<br><br>import Data.Time.Clock<br><br>outside :: Int -> Int<br>outside n =<br>  sum [i + j | i <- range, j <- range]<br>  where<br>    range = [0..n-1]<br><br>inside :: Int -> Int<br>inside n =<br>  sum [i + j | i <- [0..n-1], j <- [0..n-1]]<br><br></span><div><span style="font-family:monospace">main :: IO ()</span></div><span style="font-family:monospace">main = do<br>  t0 <- getCurrentTime<br>  print $ inside 10000<br>  t1 <- getCurrentTime<br>  print $ outside 10000<br>  t2 <-getCurrentTime<br><br>  print (diffUTCTime t1 t0)<br>  print (diffUTCTime t2 t1)</span><br><div><br></div><div>Compiling with -O2, up to GHC 8.2.2, both `inside` and `outside` functions would take the same amount of time to execute. Somewhere between GHC 8.2.2 and 8.6.4 something changed (possibly some new optimization) making `inside` run ~4x faster on my machine. With LLVM the difference is even bigger.<br></div><div><br></div><div>It is not that `outside` got slower, but that `inside` got much faster. I'm curious to what optimizations might be happening to the `inside` function that would not fire on the outside function.</div><div><br></div><div></div><div>Any hints?</div><div><br></div><div>Best regards,</div><div><br></div><div>Emilio<br></div><div><br></div><div><br></div><div><br></div><div><br></div></div>