diff --git a/CHANGES.txt b/CHANGES.txt
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,5 +1,7 @@
 Changelog for HLint
 
+1.9.10
+    Spot unsafePerformIO without NOINLINE
 1.9.9
     #89, fix compiling the executable with --flag=-gpl
 1.9.8
diff --git a/hlint.cabal b/hlint.cabal
--- a/hlint.cabal
+++ b/hlint.cabal
@@ -1,7 +1,7 @@
 cabal-version:      >= 1.6
 build-type:         Simple
 name:               hlint
-version:            1.9.9
+version:            1.9.10
 license:            BSD3
 license-file:       LICENSE
 category:           Development
@@ -96,6 +96,7 @@
         Hint.Pragma
         Hint.Structure
         Hint.Type
+        Hint.Unsafe
         Hint.Util
         Test.All
         Test.Annotations
diff --git a/src/Hint/All.hs b/src/Hint/All.hs
--- a/src/Hint/All.hs
+++ b/src/Hint/All.hs
@@ -21,6 +21,7 @@
 import Hint.Extensions
 import Hint.Duplicate
 import Hint.Comment
+import Hint.Unsafe
 
 
 -- | A list of builtin hints, currently including entries such as @\"List\"@ and @\"Bracket\"@.
@@ -36,6 +37,7 @@
     ,"Import"     + importHint
     ,"Pragma"     + pragmaHint
     ,"Extensions" + extensionsHint
+    ,"Unsafe"     + unsafeHint
     ,"Duplicate"  * duplicateHint
     ,"Comment"    - commentHint
     ]
diff --git a/src/Hint/Unsafe.hs b/src/Hint/Unsafe.hs
new file mode 100644
--- /dev/null
+++ b/src/Hint/Unsafe.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE ViewPatterns #-}
+
+{-
+    Find things that are unsafe
+
+<TEST>
+{-# NOINLINE slaves #-}; slaves = unsafePerformIO newIO
+slaves = unsafePerformIO Multimap.newIO -- {-# NOINLINE slaves #-} ; slaves = unsafePerformIO Multimap.newIO
+slaves = unsafePerformIO $ f y where foo = 1 -- {-# NOINLINE slaves #-} ; slaves = unsafePerformIO $ f y where foo = 1
+slaves v = unsafePerformIO $ Multimap.newIO where foo = 1
+slaves v = x where x = unsafePerformIO $ Multimap.newIO
+slaves = x where x = unsafePerformIO $ Multimap.newIO -- {-# NOINLINE slaves #-} ; slaves = x where x = unsafePerformIO $ Multimap.newIO
+slaves = unsafePerformIO . bar
+slaves = unsafePerformIO . baz $ x -- {-# NOINLINE slaves #-} ; slaves = unsafePerformIO . baz $ x
+slaves = unsafePerformIO . baz $ x -- {-# NOINLINE slaves #-} ; slaves = unsafePerformIO . baz $ x
+</TEST>
+-}
+
+
+module Hint.Unsafe(unsafeHint) where
+
+import Hint.Type
+import Data.Char
+
+
+unsafeHint :: ModuHint
+unsafeHint _ m =
+        [ rawIdea Error "Missing NOINLINE pragma" (toSrcSpan $ ann d)
+            (prettyPrint d)
+            (Just $ dropWhile isSpace (prettyPrint $ gen x) ++ "\n" ++ prettyPrint d)
+            []
+        | d@(PatBind _ (PVar _ x) _ _) <- moduleDecls m
+        , isUnsafeDecl d, x `notElem_` noinline]
+    where
+        gen x = InlineSig an False Nothing $ UnQual an x
+        noinline = [q | InlineSig _ False Nothing (UnQual _ q) <- moduleDecls m]
+
+isUnsafeDecl :: Decl_ -> Bool
+isUnsafeDecl (PatBind _ _ rhs bind) =
+    any isUnsafeApp (childrenBi rhs) || any isUnsafeDecl (childrenBi bind)
+isUnsafeDecl _ = False
+
+-- Am I equivalent to @unsafePerformIO x@
+isUnsafeApp :: Exp_ -> Bool
+isUnsafeApp (InfixApp _ x d _) | isDol d = isUnsafeFun x
+isUnsafeApp (App _ x _) = isUnsafeFun x
+isUnsafeApp _ = False
+
+-- Am I equivalent to @unsafePerformIO . x@
+isUnsafeFun :: Exp_ -> Bool
+isUnsafeFun (Var _ x) | x ~= "unsafePerformIO" = True
+isUnsafeFun (InfixApp _ x d _) | isDot d = isUnsafeFun x
+isUnsafeFun _ = False
