[GHC] #13807: GHC 8.2 nondeterministic with foreign imports

GHC ghc-devs at haskell.org
Fri Jun 9 10:18:27 UTC 2017


#13807: GHC 8.2 nondeterministic with foreign imports
-------------------------------------+-------------------------------------
           Reporter:  niteria        |             Owner:  (none)
               Type:  bug            |            Status:  new
           Priority:  high           |         Milestone:
          Component:  Compiler       |           Version:  8.2.1-rc2
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  None/Unknown
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 See the attached Repro.hs.

 Reproduction steps:
 {{{
 $ rm Repro.{o,hi}; ghc -O -dunique-increment=-1 Repro.hs; md5sum Repro.hi;
 rm Repro.{o,hi}; ghc -O -dunique-increment=1 Repro.hs; md5sum Repro.hi;
 [1 of 1] Compiling Repro            ( Repro.hs, Repro.o )
 97f005e3959b657bfac761aa3e8a9447  Repro.hi
 [1 of 1] Compiling Repro            ( Repro.hs, Repro.o )
 691f891fb404eb874e8bedd7bda1c8b7  Repro.hi
 }}}

 The crucial difference comes from:

 {{{
 08fffd1551f79b5aca3cafdceaf865b9
   mkStringWriter1 ::
     Int -> State# RealWorld -> (# State# RealWorld, Ptr Int #)
   {- Arity: 2, HasNoCafRefs, Strictness: <L,U><S,U>,
      Unfolding: InlineRule (2, True, False)
                 (\ (ds :: Int) (s :: State# RealWorld) ->
                  case makeStablePtr# @ Int ds s of ds1 { (#,#) ipv ipv1 ->
                  case {__pkg_ccall Int#
                                    -> StablePtr# Int
                                    -> Addr#
                                    -> Addr#
                                    -> State# RealWorld
                                    -> (# State# RealWorld, Addr# #)}
                         1#
                         ipv1
                         __label "Repro_d105" (function)
                         mkStringWriter2
                         ipv of wild { (#,#) ds2 ds3 ->
                  (# ds2, Ptr @ Int ds3 #) } }) -}
 }}}

 vs

 {{{
 a766a748e60cec63a74534e03db3bf30
   mkStringWriter1 ::
     Int -> State# RealWorld -> (# State# RealWorld, Ptr Int #)
   {- Arity: 2, HasNoCafRefs, Strictness: <L,U><S,U>,
      Unfolding: InlineRule (2, True, False)
                 (\ (ds :: Int) (s :: State# RealWorld) ->
                  case makeStablePtr# @ Int ds s of ds1 { (#,#) ipv ipv1 ->
                  case {__pkg_ccall Int#
                                    -> StablePtr# Int
                                    -> Addr#
                                    -> Addr#
                                    -> State# RealWorld
                                    -> (# State# RealWorld, Addr# #)}
                         1#
                         ipv1
                         __label "Repro_d5k1wlNFGaX" (function)
                         mkStringWriter2
                         ipv of wild { (#,#) ds2 ds3 ->
                  (# ds2, Ptr @ Int ds3 #) } }) -}
 }}}

 Notice that the labels are different.


 This doesn't reproduce under GHC 8.0.2, but that may be only because that
 version doesn't optimize it this way. This is what GHC 8.0.2 produces:
 {{{
 ccf55489bd76322a9404b365b7be7628
   mkStringWriter :: Int -> IO (Ptr Int)
   {- Arity: 2, HasNoCafRefs, Strictness: <L,U><S,U>,
      Inline: [NEVER] -}
 }}}

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


More information about the ghc-tickets mailing list