pmCheck: Don't generate PmId OccNames from Uniques
authorBen Gamari <bgamari.foss@gmail.com>
Thu, 11 May 2017 04:17:04 +0000 (00:17 -0400)
committerBen Gamari <ben@smart-cactus.org>
Thu, 11 May 2017 21:24:46 +0000 (17:24 -0400)
Doug Wilson astutely noticed that the pattern match checker was spending
a significant amount of time in mkPmId. It turns out that it was
producing Ids with OccNames that were generated from a Unique, which are
non-trivial to render. Since Var is strict in Name, Name in OccName, and
OccName in its FastString all of this encoding work was being done
despite the fact that it was (as far as I can tell) never actually
needed.

Test Plan: Validate, note allocations of `T11195`

Reviewers: austin, gkaracha

Subscribers: rwbarton, thomie

Differential Revision: https://phabricator.haskell.org/D3568

compiler/deSugar/Check.hs

index da1f004..3215856 100644 (file)
@@ -1038,7 +1038,7 @@ mkPmVars tys = mapM mkPmVar tys
 -- | Generate a fresh `Id` of a given type
 mkPmId :: Type -> DsM Id
 mkPmId ty = getUniqueM >>= \unique ->
-  let occname = mkVarOccFS (fsLit (show unique))
+  let occname = mkVarOccFS $ fsLit "$pm"
       name    = mkInternalName unique occname noSrcSpan
   in  return (mkLocalId name ty)