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, or
ghc --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.