diff --git a/ghc/lib/exts/IOExts.lhs b/ghc/lib/exts/IOExts.lhs
index a0de1cc212405af97f680e8644cf093f4a89495e..0ee5a505b7ef735232e04cd626d4025d5399045a 100644
--- a/ghc/lib/exts/IOExts.lhs
+++ b/ghc/lib/exts/IOExts.lhs
@@ -22,6 +22,7 @@ module IOExts
         , newIORef
         , readIORef
         , writeIORef
+	, updateIORef
 
 	, mkWeakIORef
 
@@ -106,9 +107,9 @@ unsafePtrEq a b =
 \end{code}
 
 \begin{code}
-newIORef   :: a -> IO (IORef a)
-readIORef  :: IORef a -> IO a
-writeIORef :: IORef a -> a -> IO ()
+newIORef    :: a -> IO (IORef a)
+readIORef   :: IORef a -> IO a
+writeIORef  :: IORef a -> a -> IO ()
 
 #ifdef __HUGS__
 type IORef a = STRef RealWorld a
@@ -124,6 +125,13 @@ readIORef  (IORef var) = stToIO (readVar var)
 writeIORef (IORef var) v = stToIO (writeVar var v)
 #endif
 
+updateIORef :: IORef a -> (a -> a) -> IO ()
+updateIORef ref f = do
+  x <- readIORef ref
+  let x' = f x
+  writeIORef ref x'
+  -- or should we return new value ? (or old?)
+
 mkWeakIORef :: IORef a -> IO () -> IO (Weak (IORef a))
 mkWeakIORef r@(IORef (MutableVar r#)) f = IO $ \s ->
   case mkWeak# r# r f s of (# s1, w #) -> (# s1, Weak w #)