Optimisation of unpackCString#

Neil Mitchell ndmitchell at gmail.com
Mon Apr 28 16:30:08 EDT 2008


Hi

(All these results are from GHC 6.9.20071226, but suspect they hold
for 6.9.* and 6.8)

The following code:

test = head "neil"

Produces (with -O2):

Text.HTML.TagSoup.Development.Sample.test =
  case GHC.Base.unpackCString# "neil" of wild_aaU {
    [] -> GHC.List.badHead @ GHC.Base.Char; : x_aaY ds1_aaZ -> x_aaY
  }

However:

test = head ['n','e','i','l']

Produces:

Text.HTML.TagSoup.Development.Sample.test = GHC.Base.C# 'n'

The packing of the string has damaged the optimisation. Is there
anyway to mitigate this? I ideally want to do this in RULES to derive
an efficient parser from a set of parser combinators, and the
unpackCString# really gets in the way of future optimisations.

I could imagine adding two rules to the simplifier:

case unpackCString# "" of  ==> case [] of
case unpackCString# "xyz" of ==> case (C# 'x': unpackCString# "yz") of

Then the simplifier could recover the optimised version.

Thanks

Neil


More information about the Glasgow-haskell-users mailing list