#7270: Incorrect optimization with Data.ByteString.append
------------------------------------------+---------------------------------
  Reporter:  ocheron                      |          Owner:  duncan          
      Type:  bug                          |         Status:  closed          
  Priority:  highest                      |      Milestone:  7.6.2           
 Component:  libraries (other)            |        Version:  7.6.1           
Resolution:  fixed                        |       Keywords:                  
        Os:  Unknown/Multiple             |   Architecture:  Unknown/Multiple
   Failure:  Incorrect result at runtime  |     Difficulty:  Unknown         
  Testcase:                               |      Blockedby:                  
  Blocking:                               |        Related:                  
------------------------------------------+---------------------------------
Changes (by duncan):

  * status:  new => closed
  * resolution:  => fixed


Comment:

 Committed to the upstream bytestring repo. So it'll be fixed in the next
 bytestring point release.

 {{{
 Tue Sep 25 16:21:14 BST 2012  Duncan Coutts <dun...@community.haskell.org>
   * Fix a few incorrect uses of inlinePerformIO
   The incorrect use of inlinePerformIO resulted in multiple calls to
   mallocByteString being shared, and hence two different strings sharing
   the same memory. See http://hackage.haskell.org/trac/ghc/ticket/7270

   Consider:
     foo x = s `seq` r
       where
         r = B.map succ x
         s = B.map succ r

   The B.map function used a pattern like:
     map f (PS fp s len) = inlinePerformIO $ ...
        fp' <- mallocByteString len

   Now, in the foo function above, we have both r and s where the compiler
   can see that the 'len' is the same in both cases, and with
   inlinePerformIO exposing everything, the compiler is free to share the
   two calls to mallocByteString len.

   The answer is not to use inlinePerformIO if we are allocating, but to
 use
   unsafeDupablePerformIO instead. Another reminder that inlinePerformIO is
   really really unsafe, and that we should be using the ST monad instead.
 }}}

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

_______________________________________________
Glasgow-haskell-bugs mailing list
Glasgow-haskell-bugs@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to