Skip to content

Fusion of a simple listArray call is very fragile

Consider the following (taken from ticket:11707#comment:117750),

module Test where                  
import Data.Array

arr, arr2 :: Array Int Int
arr = listArray (0,10) [ 1,1,1,1,1,1,1,1,1,1 ]
arr2 = listArray (0,10) [ 1,1,1,1,1,1,1,1,1,-1 ]

Given that these are a small array, one might suspect it would be worthwhile for GHC to fuse the lists with listArray, giving rise to two nicely unrolled construction procedures.

However, if you look at the Core produced by -O1 this you'll find that this only happens in the case of arr2. arr on the other handle, is mysteriously not fused. The fact that these expressions are so similar and yet produce entirely different code is quite worrying.

Trac metadata
Trac field Value
Version 7.10.3
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information