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