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 |