
#8900: unordered-containers 16% slower in HEAD vs 7.6.3 --------------------------------------------+------------------------------ Reporter: tibbe | Owner: Type: bug | Status: new Priority: normal | Milestone: Component: Compiler | Version: 7.9 Resolution: | Keywords: Operating System: MacOS X | Architecture: x86_64 Type of failure: Runtime performance bug | (amd64) Test Case: | Difficulty: Unknown Blocking: | Blocked By: | Related Tickets: --------------------------------------------+------------------------------ Comment (by tibbe): I've found a likely culprit in the generated Core. Compare the case for `Full` in `$wpoly_go` for [https://ghc.haskell.org/trac/ghc/attachment/ticket/8900/HashMapInsert-7.6.3 .dump-simpl#L569 7.6.3]: {{{ 569 case indexArray# rb_a1cI i#_s1oq of _ { (# ipv2_a1cS #) -> 570 case $wpoly_go ww_s2HT ww1_s2HX w_s2HZ (+# ww2_s2I2 4) ipv2_a1cS 571 of st'_a1cV { __DEFAULT -> }}} vs the case for `Full` in `$wpoly_go` for [https://ghc.haskell.org/trac/ghc/attachment/ticket/8900/HashMapInsert- HEAD.dump-simpl#L554 HEAD]: {{{ 554 case indexArray# dt_a2Ly i#_a2LH 555 of _ [Occ=Dead] { (# ipv2_a2LM #) -> 556 case ipv2_a2LM of st_a2LO { __DEFAULT -> 557 case $wpoly_go ww_s4A3 ww1_s4A7 w_s4zY (+# ww2_s4Ab 4) st_a2LO 558 of st'_a2LP { __DEFAULT -> }}} Both cases correspond to this snippet in `Data.HashMap.Base`: {{{ #!haskell go h k x s t@(Full ary) = let !st = A.index ary i !st' = go h k x (s+bitsPerSubkey) st }}} Here's the definition for `A.index`: {{{ #!haskell index :: Array a -> Int -> a index ary _i@(I# i#) = case indexArray# (unArray ary) i# of (# b #) -> b }}} There's an extra `case` in the HEAD version, which translates into an extra tag bits check in the Cmm. This happens in a couple of places in the core. This `case` is unnecessary since `$wpoly_go` scrutinizes `st_a2LO` immediately. This looks like a regression in strictness analysis. -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8900#comment:7 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler