Generalising the demand analysis to sum types

Simon Peyton Jones simonpj at microsoft.com
Tue Mar 1 16:56:27 UTC 2016


OK yes, once we have unboxed sums, then we can in principle at least, do worker/wrapper on arguments of sum type.  So then we need strictness analysis on sumtypes, for which your proposed extension of StrDmd looks plausible.  

Don't forget AbsDmd too!

Do start a wiki page to explain all this.

Simon

|  -----Original Message-----
|  From: José Manuel Calderón Trilla [mailto:jmct at jmct.cc]
|  Sent: 20 February 2016 23:02
|  To: Simon Peyton Jones <simonpj at microsoft.com>; Joachim Breitner
|  <mail at joachim-breitner.de>; Ömer Sinan Ağacan <omeragacan at gmail.com>
|  Cc: ghc-devs at haskell.org
|  Subject: Re: Generalising the demand analysis to sum types
|  
|  Hello again,
|  
|  The way I see it, the information would allow us to automatically unbox
|  the arguments to constructors in sum types.
|  
|  For example, with a Maybe Int, you would be able to automatically
|  unpack the Int within the Just constructor whenever the strictness
|  analysis determines that a function is strict in Just's argument.
|  Currently we can't determine any strictness greater than HeadStr for
|  sum types, which would not give us this information (since HeadStr
|  means it's only safe the evaluate up to the outermost constructor;
|  'Just' in this case).
|  
|  Combining this with the unboxed sums work, the idea is to be able to
|  not only unbox the sum, but the fields of a constructor when possible,
|  removing as many indirections as possible.
|  
|  At least, that's the plan :)
|  
|  Cheers,
|  
|  Jose
|  
|  
|  On Wed, Feb 17, 2016 at 9:09 AM, Simon Peyton Jones
|  <simonpj at microsoft.com> wrote:
|  > I think you could do that.  The key question is (as someone asked)
|  what use you would make of the information.  That is, what's the
|  payoff?
|  >
|  > Simon
|  >
|  > |  -----Original Message-----
|  > |  From: ghc-devs [mailto:ghc-devs-bounces at haskell.org] On Behalf Of
|  > | José  Manuel Calderón Trilla
|  > |  Sent: 17 February 2016 04:50
|  > |  To: ghc-devs at haskell.org
|  > |  Subject: Generalising the demand analysis to sum types
|  > |
|  > |  Hello ghc-devs,
|  > |
|  > |  Apologies for the longish email.
|  > |
|  > |  I'm looking to generalise GHC's demand analysis to work on sum
|  types.
|  > |  This is in connection with the work on unboxed sums. The idea is
|  > | that  if the strictness analysis tells us that a sum type is strict
|  > | in all  the fields of all of its constructors, it is safe to unbox
|  > | that sum  automatically. We hope for this to feed into a
|  > | worker/wrapper like  transformation for sum types.
|  > |
|  > |  I am new to the GHC codebase and wanted to make sure that my plan
|  > | of  attack seemed sensible to you all.
|  > |
|  > |  GHC's current type representing demand is StrDmd, which is defined
|  > | as
|  > |  follows:
|  > |
|  > |  data StrDmd
|  > |      = HyperStrict
|  > |      | SCall StrDmd
|  > |      | SProd [ArgStr]
|  > |      | HeadStr
|  > |
|  > |  I believe that adding sum types will be as simple as adding a
|  > | single  new constructor for Sums:
|  > |
|  > |  data StrDmd
|  > |      = HyperStrict
|  > |      | SCall StrDmd
|  > |      | SProd [ArgStr]
|  > |      | SSum [(Tag, StrDmd)]
|  > |      | HeadStr
|  > |
|  > |  We need the constructor tag so that we can analyze each branch of
|  a
|  > | case expression independently before combining the results of each
|  > | branch. Since we only care if all fields are strict for all
|  > | constructors, we won't actually use the tag information except in
|  > | the  analysis itself.
|  > |
|  > |  Projection-based strictness analysis on sum types is not new
|  > | (though  sum types + higher-order seems to be). That being said,
|  all
|  > | previous  treatments of the subject that I'm aware of forbid
|  > | polymorphic  recursion. Luckily for us we aren't trying to unbox
|  > | recursive types, so  for now [1] we will not attempt to analyze
|  > | recursive types, hence no  SMu or SRec constructor above.
|  > |
|  > |  With the analysis accepting sum types we will be able to analyze
|  > | functions with sum types as parameters, as a trivial example:
|  > |
|  > |  fromMaybe2 x y = case x of
|  > |          Just v -> v
|  > |          Nothing -> y
|  > |
|  > |  You would get a demand signature like:
|  > |
|  > |  Str=Dmdtype <S[("Just", <S,U>), ("Nothing", <>)],U><L,U>
|  > |
|  > |  Which says that the function is strict in its first argument and
|  > | that  if the value is a 'Just' then its field is used strictly, if
|  > | the value  is a 'Nothing' then there is no further demand (a
|  nullary product).
|  > |
|  > |  For those with more experience in these matter, does this seem to
|  > | be a  sensible approach?
|  > |
|  > |  Thanks in advance for any insight,
|  > |
|  > |  Jose
|  > |
|  > |
|  > |  [1]: Those of you who saw my Haskell Symposium talk on implicit
|  > | parallelism last year might remember that we will need the analysis
|  > | to  work on recursive types in order to automatically generate
|  > | parallel  strategies, but that's for later (I've spoken with Ilya
|  > | Sergey about  working on that).
|  > |  _______________________________________________
|  > |  ghc-devs mailing list
|  > |  ghc-devs at haskell.org
|  > |
|  > |
|  https://na01.safelinks.protection.outlook.com/?url=http%3a%2f%2fmail
|  > | .ha
|  > |  skell.org%2fcgi-bin%2fmailman%2flistinfo%2fghc-
|  > |
|  > |
|  devs&data=01%7c01%7csimonpj%40064d.mgd.microsoft.com%7cf731333e0c5d4
|  > | 5f3
|  > |
|  298408d33755dc98%7c72f988bf86f141af91ab2d7cd011db47%7c1&sdata=hWHFSU
|  > | Vrr  ZQqTPeQsFMQVlveHgV5ozx6%2bdpsylRIwhg%3d


More information about the ghc-devs mailing list