[GHC] #12603: INLINE and manually inlining produce different code

GHC ghc-devs at haskell.org
Thu Oct 20 12:56:28 UTC 2016


#12603: INLINE and manually inlining produce different code
-------------------------------------+-------------------------------------
        Reporter:  bgamari           |                Owner:  bgamari
            Type:  task              |               Status:  new
        Priority:  normal            |            Milestone:  8.2.1
       Component:  Compiler          |              Version:  8.0.1
      Resolution:                    |             Keywords:
Operating System:  Unknown/Multiple  |         Architecture:
                                     |  Unknown/Multiple
 Type of failure:  None/Unknown      |            Test Case:
      Blocked By:                    |             Blocking:
 Related Tickets:                    |  Differential Rev(s):
       Wiki Page:                    |
-------------------------------------+-------------------------------------

Comment (by MikolajKonarski):

 I've compared the resulting Core. The difference is that the version with
 INLINE recomputes `((2 ^ (8 :: Int) - 1)` every time, while the manually
 inlined version uses a value computed just once (note that the value is of
 type `Word32` --- I haven't verified that it matters). In the source code
 the constant is, e.g., here: https://github.com/LambdaHack/LambdaHack/blob
 /ghc-bug-12603/Game/LambdaHack/Common/Color.hs#L94

 Here are the relevant snippets of Core.

 {{{
 379842537fadd870f9dd3304e0182c0b
   attrCharFromW1 :: Word32
   {- Unfolding: (case $wf 2## 8# of ww { DEFAULT ->
                  W32# (narrow32Word# (minusWord# ww 1##)) }) -}
 0a91b1a84599352c004a37572b9588c1
   $wf :: Word# -> Int# -> Word#
   {- Arity: 2, HasNoCafRefs, Strictness: <L,U><S,U>, Inline: [0] -}
 41b3e215bf375441beb5fb607472bd73
   $wattrCharFromW32 :: Word# -> (# Attr, Char# #)
   {- Arity: 1, Strictness: <S,U>, Inline: [0],
      Unfolding: (\ (ww :: Word#) ->
                  case attrCharFromW1 of wild1 { W32# y# ->
                  let {
                    x :: Int# = word2Int# (and# (uncheckedShiftRL# ww 8#)
 y#)
                  } in
                  case tagToEnum# @ Bool (>=# x 0#) of wild {
                    False -> case $fBinaryColor3 x ret_ty (# Attr, Char# #)
 of {}
                    True
                    -> case tagToEnum# @ Bool (<=# x 15#) of wild2 {
                         False -> case $fBinaryColor3 x ret_ty (# Attr,
 Char# #) of {}
                         True
                         -> case tagToEnum# @ Color x of dt { DEFAULT ->
                            let {
                              x1 :: Int# = word2Int# (and# ww y#)
                            } in
                            case tagToEnum# @ Bool (>=# x1 0#) of wild3 {
                              False -> case $fBinaryColor3 x1 ret_ty (#
 Attr, Char# #) of {}
                              True
                              -> case tagToEnum# @ Bool (<=# x1 15#) of
 wild4 {
                                   False -> case $fBinaryColor3 x1 ret_ty
 (# Attr, Char# #) of {}
                                   True
                                   -> case tagToEnum# @ Color x1 of dt1 {
 DEFAULT ->
                                      let {
                                        i# :: Int# = word2Int#
 (uncheckedShiftRL# ww 16#)
                                      } in
                                      case tagToEnum#
                                             @ Bool
                                             (leWord# (int2Word# i#)
 1114111##) of wild5 {
                                        False -> case chr2 i# ret_ty (#
 Attr, Char# #) of {}
                                        True -> (# Attr dt dt1, chr# i# #)
 } } } } } } } }) -}
 8b854d1c31d32d5f70ae60f00eb8d52b
   $wattrCharFromW32' :: Word# -> (# Attr, Char# #)
   {- Arity: 1, Strictness: <S,U>, Inline: [0],
      Unfolding: (\ (ww :: Word#) ->
                  case $wf 2## 8# of ww1 { DEFAULT ->
                  let {
                    x :: Int#
                    = word2Int#
                        (and#
                           (uncheckedShiftRL# ww 8#)
                           (narrow32Word# (minusWord# ww1 1##)))
                  } in
                  case tagToEnum# @ Bool (>=# x 0#) of wild {
                    False -> case $fBinaryColor3 x ret_ty (# Attr, Char# #)
 of {}
                    True
                    -> case tagToEnum# @ Bool (<=# x 15#) of wild1 {
                         False -> case $fBinaryColor3 x ret_ty (# Attr,
 Char# #) of {}
                         True
                         -> case tagToEnum# @ Color x of dt { DEFAULT ->
                            let {
                              x1 :: Int#
                              = word2Int# (and# ww (narrow32Word#
 (minusWord# ww1 1##)))
                            } in
                            case tagToEnum# @ Bool (>=# x1 0#) of wild2 {
                              False -> case $fBinaryColor3 x1 ret_ty (#
 Attr, Char# #) of {}
                              True
                              -> case tagToEnum# @ Bool (<=# x1 15#) of
 wild3 {
                                   False -> case $fBinaryColor3 x1 ret_ty
 (# Attr, Char# #) of {}
                                   True
                                   -> case tagToEnum# @ Color x1 of dt1 {
 DEFAULT ->
                                      let {
                                        i# :: Int# = word2Int#
 (uncheckedShiftRL# ww 16#)
                                      } in
                                      case tagToEnum#
                                             @ Bool
                                             (leWord# (int2Word# i#)
 1114111##) of wild4 {
                                        False -> case chr2 i# ret_ty (#
 Attr, Char# #) of {}
                                        True -> (# Attr dt dt1, chr# i# #)
 } } } } } } } }) -}
 }}}

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/12603#comment:6>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler


More information about the ghc-tickets mailing list