Ticket #5298 (new bug)

Opened 23 months ago

Last modified 9 months ago

Inlined functions aren't fully specialised

Reported by: reinerp Owned by:
Priority: low Milestone: 7.6.2
Component: Compiler Version: 7.0.3
Keywords: Cc: hackage.haskell.org@…, pho@…, jpm@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Runtime performance bug Difficulty:
Test Case: Blocked By:
Blocking: Related Tickets:

Description

When a function is inlined, it can expose other functions as candidates for specialisation, but GHC doesn't specialise them.

For instance, given the two modules

module A where

{-# INLINABLE fac #-}
fac :: Num a => a -> a
fac 0 = 1
fac n = n * fac (n-1)

{-# INLINE f #-}
f :: Num a => a -> a
f a = fac a
module B where

import A

g :: Int -> Int
g x = f x

we see that f is inlined, but fac isn't specialised for Ints:

B.g :: Int -> Int
[GblId,
 Arity=1,

 Unf=Unf{Src=<vanilla>, TopLvl=True, Arity=1, Value=True,
         ConLike=True, Cheap=True, Expandable=True,
         Guidance=IF_ARGS [0] 30 0}]
B.g =
  \ (x_ary :: Int) ->
    A.fac @ Int $fNumInt x_ary

Removing the INLINE pragma on f doesn't help.

Either of the following changes will cause fac to be specialised:

  • adding {-# SPECIALISE f :: Int -> Int #-} to module B
  • defining "g x = fac x" instead

This happens with both GHC 7.0.3 and GHC HEAD

Change History

Changed 23 months ago by liyang

  • cc hackage.haskell.org@… added

Changed 23 months ago by PHO

  • cc pho@… added

Changed 23 months ago by dreixel

  • cc jpm@… added

Changed 23 months ago by igloo

  • milestone set to 7.4.1

Confirmed: with g x = fac x and

ghc -O B -ddump-simpl

we get

[...]
B.g [InlPrag=INLINE[0]] :: GHC.Types.Int -> GHC.Types.Int
[...]
"SPEC A.fac [GHC.Types.Int]" [ALWAYS]
    forall {$dNum_srl :: GHC.Num.Num GHC.Types.Int}
      A.fac @ GHC.Types.Int $dNum_srl
      = B.$sfac

Changed 16 months ago by igloo

  • priority changed from normal to low
  • milestone changed from 7.4.1 to 7.6.1

Changed 9 months ago by igloo

  • milestone changed from 7.6.1 to 7.6.2
Note: See TracTickets for help on using tickets.