Opened 10 years ago

Closed 6 years ago

#2078 closed bug (fixed)

INLINE and strictness

Reported by: simonpj Owned by: simonpj
Priority: lowest Milestone: 7.6.1
Component: Compiler Version: 6.8.2
Keywords: Cc: ndp@…
Operating System: Unknown/Multiple Architecture: Unknown/Multiple
Type of failure: Runtime performance bug Test Case:
Blocked By: Blocking:
Related Tickets: Differential Rev(s):
Wiki Page:

Description

Consider this code

module A where
  {-# INLINE [0] foo #-}
  {#- RULE foo (reverse xs) = xs #-}
  foo xs = reverse $ xs

module B where
  import A( foo )
  g b ys = foo (case b of 
                  True -> reverse ys
                  False -> ys)

  h xs = map foo xs

At the moment the body of foo is not optimised at all, because it's going to be inlined. But that means that

  • The foo executed by the map in h is very inefficient, because it actually calls $ etc.
  • The strictness analyser doesn't see that foo is strict, because again the $ gets in the way. So the rule for foo does not match in the RHS of g. (If foo were strict, we'd push the call to foo inside the case branches.)

For both reasons it'd be better to

  • Retain the original RHS of foo for inlining purposes
  • But otherwise optimise foo normally, so that if it is not inlined, we get the efficient version, and so that strictness analysis does the right thing.

Hmm. Maybe INLINE should turn into a RULE, rather than (as now) a Note in Core?

Anyway, this ticket is to make sure I don't forget this point.

Change History (12)

comment:1 Changed 10 years ago by simonpj

Here's a concrete example when this came up:

Wed Jan 23 16:12:07 PST 2008  Roman Leshchinskiy <rl@cse.unsw.edu.au>
  * Make zipD strict in both arguments

  The strictness analyser doesn't seem to be able to figure this out. This
  change improves fusion.

    M ./Data/Array/Parallel/Unlifted/Distributed/Types.hs -2 +2

comment:2 Changed 9 years ago by simonmar

Architecture: UnknownUnknown/Multiple

comment:3 Changed 9 years ago by simonmar

Operating System: UnknownUnknown/Multiple

comment:4 Changed 9 years ago by igloo

Milestone: 6.10 branch6.12 branch

comment:5 Changed 8 years ago by simonmar

Type of failure: Runtime performance bug

comment:6 Changed 7 years ago by igloo

Milestone: 6.12 branch6.12.3

comment:7 Changed 7 years ago by igloo

Milestone: 6.12.36.14.1
Priority: normallow

comment:8 Changed 7 years ago by igloo

Milestone: 7.0.17.0.2

comment:9 Changed 7 years ago by igloo

Milestone: 7.0.27.2.1

comment:10 Changed 6 years ago by igloo

Milestone: 7.2.17.4.1

comment:11 Changed 6 years ago by igloo

Milestone: 7.4.17.6.1
Priority: lowlowest

comment:12 Changed 6 years ago by simonpj

Resolution: fixed
Status: newclosed

Actually this ticket is implemented, I forget exactly when. INLINE things do capture the RHS in the Unfolding and optimise the RHS separately. Hurrah.

Note: See TracTickets for help on using tickets.