diff options
author | Simon Peyton Jones <simonpj@microsoft.com> | 2017-02-23 14:41:08 +0000 |
---|---|---|
committer | Simon Peyton Jones <simonpj@microsoft.com> | 2017-02-24 09:04:46 +0000 |
commit | a6e13d502ef46de854ec1babcd764ccce68c95e3 (patch) | |
tree | f6ace9b7af1b394546a885f1b2bb0699b67ccc37 /compiler/coreSyn | |
parent | c88b7c9a06e387c3b9bdb359b9e1e4f3a9fba696 (diff) | |
download | haskell-a6e13d502ef46de854ec1babcd764ccce68c95e3.tar.gz |
Make exprIsConApp_maybe work better for literals strings
There are two things here
* Use exprIsLiteral_maybe to "look through" a variable bound
to a literal string.
* Add CONLIKE to the NOINLINE pragma for unpackCString# and
unpackCStringUtf8#
See Trac #13317, Trac #10844, and
Note [exprIsConApp_maybe on literal strings] in CoreSubst
I did a nofib run and got essentially zero change except for one
2.2% improvement in allocation for 'pretty'.
Diffstat (limited to 'compiler/coreSyn')
-rw-r--r-- | compiler/coreSyn/CoreSubst.hs | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/compiler/coreSyn/CoreSubst.hs b/compiler/coreSyn/CoreSubst.hs index 89a92f886a..53072dc0d9 100644 --- a/compiler/coreSyn/CoreSubst.hs +++ b/compiler/coreSyn/CoreSubst.hs @@ -1378,7 +1378,7 @@ However e might not *look* as if Note [exprIsConApp_maybe on literal strings] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -See #9400. +See #9400 and #13317. Conceptually, a string literal "abc" is just ('a':'b':'c':[]), but in Core they are represented as unpackCString# "abc"# by MkCore.mkStringExprFS, or @@ -1394,6 +1394,13 @@ We need to be careful about UTF8 strings here. ""# contains a ByteString, so we must parse it back into a FastString to split off the first character. That way we can treat unpackCString# and unpackCStringUtf8# in the same way. +We must also be caeful about + lvl = "foo"# + ...(unpackCString# lvl)... +to ensure that we see through the let-binding for 'lvl'. Hence the +(exprIsLiteral_maybe .. arg) in the guard before the call to +dealWithStringLiteral. + Note [Push coercions in exprIsConApp_maybe] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ In Trac #13025 I found a case where we had @@ -1460,9 +1467,11 @@ exprIsConApp_maybe (in_scope, id_unf) expr , let in_scope' = extendInScopeSetSet in_scope (exprFreeVars rhs) = go (Left in_scope') rhs cont - | (fun `hasKey` unpackCStringIdKey) - || (fun `hasKey` unpackCStringUtf8IdKey) - , [Lit (MachStr str)] <- args + -- See Note [exprIsConApp_maybe on literal strings] + | (fun `hasKey` unpackCStringIdKey) || + (fun `hasKey` unpackCStringUtf8IdKey) + , [arg] <- args + , Just (MachStr str) <- exprIsLiteral_maybe (in_scope, id_unf) arg = dealWithStringLiteral fun str co where unfolding = id_unf fun |