Skip to content

Rework when `INLINEABLE` expressions are allowed to inline.

Summary

Currently the short description of INLINEABLE says:

{-# INLINABLE ⟨name⟩ #-}: Suggest that the compiler always consider inlining name.

But this is definitely not true. We currently still NEVER inline unfoldings larger than -funfolding-use-threshold even for bindings marked INLINEABLE for which the arguments would otherwise compel us to do so.

Steps to reproduce

Any function larger than -funfolding-use-threshold will show this. For example:

See under the spoiler tag below for the full example:

{-# INLINABLE fff #-}
fff :: Int -> Int
fff x = case x of
  0 -> 0
  1 -> -1
  2 -> -2
  3 -> -3
  4 -> -4
  5 -> -5
  6 -> -6
  7 -> -7
  8 -> -8
  9 -> -9
  10 -> -10
  11 -> -11
  12 -> -12
  13 -> -13
  14 -> -14
  15 -> -15
  16 -> -16
  17 -> -17
  18 -> -18
  19 -> -19
  20 -> -20
  21 -> -21
  22 -> -22
  23 -> -23
  24 -> -24
  25 -> -25
  26 -> -26
  27 -> -27
  28 -> -28
  29 -> -29
  30 -> -30
  31 -> -31
  32 -> -32
  33 -> -33
  34 -> -34
  35 -> -35
  36 -> -36
  37 -> -37
  38 -> -38
  39 -> -39
  40 -> -40
  41 -> -41
  42 -> -42
  43 -> -43
  44 -> -44
  45 -> -45
  46 -> -46
  47 -> -47
  48 -> -48
  49 -> -49
  50 -> -50
  51 -> -51
  52 -> -52
  53 -> -53
  54 -> -54
  55 -> -55
  56 -> -56
  57 -> -57
  58 -> -58
  59 -> -59
  60 -> -60
  61 -> -61
  62 -> -62
  63 -> -63
  64 -> -64
  65 -> -65
  66 -> -66
  67 -> -67
  68 -> -68
  69 -> -69
  70 -> -70
  71 -> -71
  72 -> -72
  73 -> -73
  74 -> -74
  75 -> -75
  76 -> -76
  77 -> -77
  78 -> -78
  79 -> -79
  80 -> -80
  81 -> -81
  82 -> -82
-- RHS size: {terms: 175, types: 5, coercions: 0, joins: 0/0}
fff [InlPrag=INLINABLE] :: Int -> Int
[GblId,
 Arity=1,
 Str=<1!P(1L)>,
 Cpr=1,
 Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
         WorkFree=True, Expandable=True, Guidance=NEVER
         Tmpl= \ (x_ayW [Occ=Once1!] :: Int) ->
                 case x_ayW of { GHC.Types.I# ds_dZ8 [Occ=Once1!] ->
                 case ds_dZ8 of {
                   __DEFAULT ->
                     case Control.Exception.Base.patError
                            @GHC.Types.LiftedRep @() "Test.hs:(19,9)-(102,11)|case"#
                     of {
                     };
                   0# -> GHC.Types.I# 0#;
                   1# -> GHC.Types.I# -1#;
                   ...
...

Expected behavior

Naively one would expect the unfolding guidance to be the usual size vs discount tradeoff. Instead we only get Guidance=NEVER.

Environment

  • GHC version used: All pretty much

To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information