Cheng Shao pushed to branch wip/gbc-faster-internal-names at Glasgow Haskell Compiler / GHC

Commits:

1 changed file:

Changes:

  • compiler/GHC/ByteCode/Binary.hs
    ... ... @@ -20,7 +20,7 @@ module GHC.ByteCode.Binary (
    20 20
     import GHC.Prelude
    
    21 21
     
    
    22 22
     import GHC.ByteCode.Types
    
    23
    -import GHC.Data.FastString
    
    23
    +import qualified GHC.Data.Word64Map.Strict as Word64Map
    
    24 24
     import GHC.Types.Name
    
    25 25
     import GHC.Types.Name.Cache
    
    26 26
     import GHC.Types.Name.Env
    
    ... ... @@ -269,9 +269,8 @@ addBinNameWriter bh' = do
    269 269
             | otherwise -> do
    
    270 270
                 putByte bh 1
    
    271 271
                 key <- getBinNameKey env_ref nm
    
    272
    -            -- Delimit the OccName from the deterministic counter to keep the
    
    273
    -            -- encoding injective, avoiding collisions like "foo1" vs "foo#1".
    
    274
    -            put_ bh (occNameFS (occName nm) `appendFS` mkFastString ('#' : show key))
    
    272
    +            put_ bh $ occNameFS $ occName nm
    
    273
    +            put_ bh key
    
    275 274
       where
    
    276 275
         -- Find a deterministic key for local names. This
    
    277 276
         getBinNameKey ref name = do
    
    ... ... @@ -282,7 +281,7 @@ addBinNameWriter bh' = do
    282 281
     
    
    283 282
     addBinNameReader :: NameCache -> ReadBinHandle -> IO ReadBinHandle
    
    284 283
     addBinNameReader nc bh' = do
    
    285
    -  env_ref <- newIORef emptyOccEnv
    
    284
    +  env_ref <- newIORef Word64Map.empty
    
    286 285
       pure $ flip addReaderToUserData bh' $ BinaryReader $ \bh -> do
    
    287 286
         t <- getByte bh
    
    288 287
         case t of
    
    ... ... @@ -291,15 +290,16 @@ addBinNameReader nc bh' = do
    291 290
             pure $ BinName nm
    
    292 291
           1 -> do
    
    293 292
             occ <- mkVarOccFS <$> get bh
    
    293
    +        key <- get bh
    
    294 294
             -- We don't want to get a new unique from the NameCache each time we
    
    295 295
             -- see a name.
    
    296 296
             nm' <- unsafeInterleaveIO $ do
    
    297 297
               u <- takeUniqFromNameCache nc
    
    298 298
               evaluate $ mkInternalName u occ noSrcSpan
    
    299 299
             fmap BinName $ atomicModifyIORef' env_ref $ \env ->
    
    300
    -          case lookupOccEnv env occ of
    
    300
    +          case Word64Map.lookup key env of
    
    301 301
                 Just nm -> (env, nm)
    
    302
    -            _ -> nm' `seq` (extendOccEnv env occ nm', nm')
    
    302
    +            _ -> nm' `seq` (Word64Map.insert key nm' env, nm')
    
    303 303
           _ -> panic "Binary BinName: invalid byte"
    
    304 304
     
    
    305 305
     -- Note [Serializing Names in bytecode]