Behaviour of INLINABLE depends on whether the modules included are already compiled.
When investigating containers performance, I came across the following problem:
My Data.Map annotates nearly every method as INLINABLE. My main module Main.hs is trivial:
import Data.Map as M
main = print $ M.lookup 5 $ foldr (\x -> insert x x) empty [1..100]
Suppose my tree contains only .hs files, no .hi or .o. I can compile either by
ghc --make -c -O Main.hs, which compiles Data/Map.hs automatically, orghc --make -c -O Data/Map.hs && ghc --make -c -O Main.hs, which compiles Data/Map.hs explicitely with the same arguments first.
Expected result of both compilations: Main.o is the same.
Actual result: in the first case, Data.Map.lookup method does not get inlined in Main.o, but in the second case the Data.Map.lookup method gets inlined in Main.o.
If affects both ghc-7.0 and ghc-head branches.
I am not sure this is a bug, but I would definitely expect both of the compilation methods to yield the same file.
The self-contained source tree is attached.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 7.1 |
| Type | Bug |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | simonpj |
| Operating system | |
| Architecture |