Skip to content

Adding "-auto-all" when using "-O2 -prof" causes "<<loop>>"

The program below works fine (and outputs "ZeroPmt") when compiled with "-O2 -prof -fno-cse", but when you add in "-auto-all" it causes "<<loop>>".

There are many ways to workaround the problem, uncommenting pretty much any of the commented-out lines avoids the issue, but my impression is that adding "-auto-all" shouldn't cause this.

This is with stock 6.10.1. "-dcore-lint" has no effect.

--
-- Compile with : ghc -O2 -prof -auto-all -fno-cse --make ~/loop.hs
--
-- ...and it breaks, outputting <<loop>>
-- ...compile without "-auto-all" and you get ZeroPmt
--
import Data.IORef
import qualified Data.Map as Map
import System.IO
import System.IO.Unsafe
import System.Mem.StableName

main :: IO ()
main = do

 -- putStrLn $ show $ unHC $ mkHC ZeroPmt -- Works OK
 putStrLn $ show $ unHC $ mkHC $ unHC $ mkHC ZeroPmt

data Expr = Add | ZeroPmt deriving (Ord, Eq, Show)
data ExprHC = ExprHC { unStableName :: !(StableName Expr), unHC ::
!Expr} deriving (Eq)

-- {-# NOINLINE mkHC #-} -- Works OK
-- mkHC e = hashConser e -- Works OK
mkHC = hashConser

{-# NOINLINE hashConser #-}
hashConser :: Expr -> ExprHC
hashConser e = deepSeq e (unsafePerformIO $ mkHC' e)
-- hashConser e = seq (e == e) (unsafePerformIO $ mkHC' e)
 where
   refTbl = unsafePerformIO $ newIORef Map.empty

   mkHC' e = do
     tbl <- readIORef refTbl
     case Map.lookup e tbl of
       Just ehc -> return ehc
       Nothing -> do
                     sn <- makeStableName e
                     let ehc = ExprHC sn e
                     writeIORef refTbl $ Map.insert e ehc tbl
                     return ehc

deepSeq :: Eq e => e -> x -> x
deepSeq e x = seq (e == e) x
Trac metadata
Trac field Value
Version 6.10.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Profiling
Test case
Differential revisions
BlockedBy
Related
Blocking
CC ben@moseley.name
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information