title: Word foldl' isn't optimized as well as Int foldl'
body: <pre><code>import Data.List
  
  test :: Int -&gt; Int
  test n = foldl' (+) 0 [1..n]
  
  main :: IO ()
  main = do
    print $ test $ 10^8
  </code></pre>
  
  <p>GHC optimizes the above code to the point that the garbage collector doesn't even have to do anything:</p>
  
  <pre><code>$ ghc -rtsopts -O2 testInt &amp;&amp; ./testInt +RTS -s
  [1 of 1] Compiling Main             ( testInt.hs, testInt.o )
  Linking testInt ...
  5000000050000000
            51,752 bytes allocated in the heap
             3,480 bytes copied during GC
            44,384 bytes maximum residency (1 sample(s))
            17,056 bytes maximum slop
                 1 MB total memory in use (0 MB lost due to fragmentation)
  
                                       Tot time (elapsed)  Avg pause  Max pause
    Gen  0         0 colls,     0 par    0.000s   0.000s     0.0000s    0.0000s
    Gen  1         1 colls,     0 par    0.000s   0.000s     0.0001s    0.0001s
  
    INIT    time    0.000s  (  0.000s elapsed)
    MUT     time    0.101s  (  0.101s elapsed)
    GC      time    0.000s  (  0.000s elapsed)
    EXIT    time    0.000s  (  0.000s elapsed)
    Total   time    0.103s  (  0.102s elapsed)
  
    %GC     time       0.1%  (0.1% elapsed)
  
    Alloc rate    511,162 bytes per MUT second
  
    Productivity  99.8% of total user, 100.9% of total elapsed
  </code></pre>
  
  <p>However, if I change the type of <code>test</code> to <code>test :: Word -&gt; Word</code>, then a lot of garbage is produced and the code runs 40x slower.</p>
  
  <pre><code>ghc -rtsopts -O2 testWord &amp;&amp; ./testWord +RTS -s
  [1 of 1] Compiling Main             ( testWord.hs, testWord.o )
  Linking testWord ...
  5000000050000000
    11,200,051,784 bytes allocated in the heap
         1,055,520 bytes copied during GC
            44,384 bytes maximum residency (2 sample(s))
            21,152 bytes maximum slop
                 1 MB total memory in use (0 MB lost due to fragmentation)
  
                                       Tot time (elapsed)  Avg pause  Max pause
    Gen  0     21700 colls,     0 par    0.077s   0.073s     0.0000s    0.0000s
    Gen  1         2 colls,     0 par    0.000s   0.000s     0.0001s    0.0001s
  
    INIT    time    0.000s  (  0.000s elapsed)
    MUT     time    4.551s  (  4.556s elapsed)
    GC      time    0.077s  (  0.073s elapsed)
    EXIT    time    0.000s  (  0.000s elapsed)
    Total   time    4.630s  (  4.630s elapsed)
  
    %GC     time       1.7%  (1.6% elapsed)
  
    Alloc rate    2,460,957,186 bytes per MUT second
  
    Productivity  98.3% of total user, 98.3% of total elapsed
  </code></pre>
  
  <p>Why does this happen? I expected the performance to be nearly identical?
  (I'm using GHC version 8.0.1 on x86_64 GNU/Linux)</p>
  
  <p>edit: I submitted a bug: <a href="https://ghc.haskell.org/trac/ghc/ticket/12354#ticket" rel="nofollow">https://ghc.haskell.org/trac/ghc/ticket/12354#ticket</a></p>