Hey, Michael! I'm not going to give you the answer to your question, just a new bit of information. If you check the core generated from -O2 you'll see that this is what the IORef version of "inlinePerformIO" looks like: -- prints "inlinePerformIO" case Handle.Text.hPutStr2 Handle.FD.stdout lvl2_r5GX True ipv28_X3s6 of _ [Occ=Dead] { (# ipv30_X3vu, ipv31_X3sc #) -> -- reads current value case readMutVar# @ RealWorld @ Char ipv3_a3pa ipv30_X3vu of _ [Occ=Dead] { (# ipv32_X3uU, ipv33_X3uX #) -> -- prints current value case Handle.Text.hPutStr2 Handle.FD.stdout ($fShowChar_$cshow ipv33_X3uX) True ipv32_X3uU of _ [Occ=Dead] { (# ipv34_X3si, ipv35_X3sk #) -> -- sets new value case writeMutVar# @ RealWorld @ Char ipv3_a3pa lvl10_r5H5 realWorld# of _ [Occ=Dead] { __DEFAULT -> -- reads current value case readMutVar# @ RealWorld @ Char ipv3_a3pa ipv34_X3si of _ [Occ=Dead] { (# ipv36_X3v6, ipv37_X3v9 #) -> -- prints current value case Handle.Text.hPutStr2 Handle.FD.stdout ($fShowChar_$cshow ipv37_X3v9) True ipv36_X3v6 -- ... While this is what the Vector version of "inlinePerformIO" looks like: -- prints "inlinePerformIO" case Handle.Text.hPutStr2 Handle.FD.stdout lvl2_r5GX True ipv72_X3zS of _ [Occ=Dead] { (# ipv74_X3uq, ipv75_X3us #) -> -- prints current value case a_s32R ipv74_X3uq of _ [Occ=Dead] { (# ipv76_X3uu, ipv77_X3uw #) -> -- prints current value case a_s32R ipv76_X3uu of _ [Occ=Dead] { (# ipv78_X3v5, ipv79_X3v7 #) -> -- ... Ouch! Everything was optimized away :(. For reference, this is what the "inlinePerformIO + read" version looks like: -- prints "inlinePerformIO + read" case Handle.Text.hPutStr2 Handle.FD.stdout lvl1_r5GW True ipv78_X3v5 of _ [Occ=Dead] { (# ipv80_X3Bs, ipv81_X3vb #) -> -- prints current value case a_s32R ipv80_X3Bs of _ [Occ=Dead] { (# ipv82_X3vd, ipv83_X3vf #) -> -- sets new value then read it case readArray# @ (Control.Monad.Primitive.PrimState IO) @ Char ipv55_a2Ze 0 (writeArray# @ (Control.Monad.Primitive.PrimState IO) @ Char ipv55_a2Ze 0 lvl_r5GV (realWorld# `cast` ((State# (Sym Control.Monad.Primitive.TFCo:R:PrimStateIO[0]))_R :: State# RealWorld ~# State# (Control.Monad.Primitive.PrimState IO)))) of _ [Occ=Dead] { (# ipv84_s5yV, ipv85_s5yW #) -> -- prints current value a_s32R ipv82_X3vd Hmmmm... -- Felipe.