Use isTrue# for pointer equality
authorDavid Feuer <David.Feuer@gmail.com>
Mon, 1 Aug 2016 17:56:31 +0000 (13:56 -0400)
committerDavid Feuer <David.Feuer@gmail.com>
Mon, 1 Aug 2016 17:57:55 +0000 (13:57 -0400)
Edward Kmett says it's better to do that and take the load off
core-to-core. Currently, that gets shifted to codegen, I think.

Data/Utils/PtrEquality.hs

index 5ab38fa..324ef40 100644 (file)
@@ -7,14 +7,21 @@ module Data.Utils.PtrEquality (ptrEq) where
 
 #ifdef __GLASGOW_HASKELL__
 import GHC.Exts ( reallyUnsafePtrEquality# )
+#if __GLASGOW_HASKELL__ < 707
+import GHC.Exts ( (==#) )
+#else
+import GHC.Exts ( isTrue# )
+#endif
 
 -- | Checks if two pointers are equal. Yes means yes;
 -- no means maybe. The values should be forced to at least
 -- WHNF before comparison to get moderately reliable results.
 ptrEq :: a -> a -> Bool
-ptrEq x y = case reallyUnsafePtrEquality# x y of
-              1# -> True
-              _ -> False
+#if __GLASGOW_HASKELL__ < 707
+ptrEq x y = reallyUnsafePtrEquality# x y ==# 1#
+#else
+ptrEq x y = isTrue# (reallyUnsafePtrEquality# x y)
+#endif
 
 #else
 ptrEq :: a -> a -> Bool