[GHC] #12603: INLINE and manually inlining produce different code

GHC ghc-devs at haskell.org
Fri Oct 21 11:26:34 UTC 2016


#12603: INLINE and manually inlining produce different code
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:  bgamari
            Type:  task              |               Status:  new
        Priority:  normal            |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by MikolajKonarski):

 Replying to [comment:8 simonpj]:
 > > When I INLINE[...], when I NOINLINE it [...] and when I leave it alone
 [...
 >
 > This isn't necessarily surprising.  Consider [...]

 Thank you for the example. I've fixed the inlining status of all enclosing
 or competing functions in the module, but the strange behaviour persists.
 Now I suspect the complaints I have may not be related after all: 1. not
 floating out constants with INLINE as opposed to identical manual
 inlining; 2. erratic/unpredictable/surprising/buggy behaviour of INLINE vs
 NOINLINE vs <nothing> 3. three different figures for these, instead of
 two.

 I've just opened a feature request ticket for 3:
 https://ghc.haskell.org/trac/ghc/ticket/12747#ticket. This comment is
 about 2. If I find a smaller or simpler example for 2 and it's still as
 surprising, I will open a new bug report for it. As you point out, it's
 possible that 2 is not a bug, but just an exemplification of GHC being
 smarter than either us.

 > But if you add an `INLINE` pragma to `f`, then `g` becomes big, so GHC
 won't inline it. [...]
 > These effects can be large, and are very hard to predict.  GHC makes no
 guarantees, I'm afraid.

 The guarantee that would help greatly would be that the behaviour of the
 program with neither INLINE nor NOINLINE for function `f` is the same as
 the behaviour with INLINE or that with NOINLINE. It would help
 tremendously with profiling experiments, because then I could fix the
 state of inlining of `f` and tune `g` and `h` without worry that inlining
 of `f` changes silently. But if `f` has the lowest allocation only without
 any pragmas at all, I can't fix it. See the feature request.

 > It's a bit more puzzling that you say your big function is called only
 once

 I meant syntactically (even taking into account inlining of any other
 functions). But it's called inside a loop. It's referenced exactly once
 and fully applied, here:
 https://github.com/LambdaHack/LambdaHack/blob/master/Game/LambdaHack/Client/UI/DrawM.hs#L273

 > However a difference between 2.9G and 4.3G is very large, and it would
 be great to get more insight into why.  I use `-ticky` to investigate this
 kind of thing.

 Thank you for the tips.

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12603#comment:10>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list