
#8425: ghc-7.6.3: crossmodule inline leads to buggy code (-O2) -------------------------------------+---------------------------------- Reporter: slyfox | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.6.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: x86_64 (amd64) Type of failure: Runtime crash | Difficulty: Unknown Test Case: | Blocked By: Blocking: | Related Tickets: -------------------------------------+---------------------------------- Comment (by slyfox): My theory is the bug is induced by '''{-# INLINABLE insert #-}''' and '''{-# INLINABLE lookup #-}''' pragmas. It makes Main module use '''BuggyOpt.$sinsert''' specialisation (with it's environment taken into account). It's seen nicely when we build Main in both modes: good (all ok: Base.lookup): {{{ ==================== Occurrence analysis ==================== [snip instances] Main.mkLin :: Arr.Array GHC.Types.Int -> Base.Map (Arr.Array GHC.Types.Int) GHC.Types.Int [LclIdX, Arity=1, Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=1, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 110 0}] Main.mkLin = \ (mseqs_amq :: Arr.Array GHC.Types.Int) -> case Base.lookup @ (Arr.Array GHC.Types.Int) @ (GHC.Prim.Any *) (Arr.$fEqArray @ GHC.Types.Int) mseqs_amq (Base.empty @ (Arr.Array GHC.Types.Int) @ (GHC.Prim.Any *)) of _ { __DEFAULT -> Base.insert @ (Arr.Array GHC.Types.Int) @ GHC.Types.Int $dOrd_apD mseqs_amq (GHC.Types.I# 1) (Base.empty @ (Arr.Array GHC.Types.Int) @ GHC.Types.Int) } }}} bad (note BuggyOpt.$sinsert on an early phase): {{{ ==================== Occurrence analysis ==================== Main.mkLin :: Arr.Array GHC.Types.Int -> Base.Map (Arr.Array GHC.Types.Int) GHC.Types.Int [LclIdX, Arity=1, Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=1, Value=True, ConLike=True, WorkFree=True, Expandable=True, Guidance=IF_ARGS [0] 100 0}] Main.mkLin = \ (mseqs_amy :: Arr.Array GHC.Types.Int) -> case Base.lookup @ (Arr.Array GHC.Types.Int) @ (GHC.Prim.Any *) (Arr.$fEqArray @ GHC.Types.Int) mseqs_amy (Base.empty @ (Arr.Array GHC.Types.Int) @ (GHC.Prim.Any *)) of _ { __DEFAULT -> BuggyOpt.$sinsert @ GHC.Types.Int mseqs_amy (GHC.Types.I# 1) (Base.empty @ (Arr.Array GHC.Types.Int) @ GHC.Types.Int) } }}} Does it look suspicious? -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8425#comment:5 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler