diff --git a/Data/Vector/Storable.hs b/Data/Vector/Storable.hs
index 65af6d7ebbb3854b34623877b9f463c57e8d7cf4..ebb68e1521ab4723fe43d9da94d909ff6766784a 100644
--- a/Data/Vector/Storable.hs
+++ b/Data/Vector/Storable.hs
@@ -1375,6 +1375,11 @@ unsafeFromForeignPtr fp i n = unsafeFromForeignPtr0 fp' n
     where
       fp' = updPtr (`advancePtr` i) fp
 
+{-# RULES
+"unsafeFromForeignPtr fp 0 n -> unsafeFromForeignPtr0 fp n " forall fp n.
+  unsafeFromForeignPtr fp 0 n = unsafeFromForeignPtr0 fp n
+  #-}
+
 -- | /O(1)/ Create a vector from a 'ForeignPtr' and a length.
 --
 -- It is assumed the pointer points directly to the data (no offset).
diff --git a/Data/Vector/Storable/Mutable.hs b/Data/Vector/Storable/Mutable.hs
index 8c3e284c24a7e2819e7ccb1ecd02a0cd312e4106..7b87986f433615553f217d34d5fb8423e502906c 100644
--- a/Data/Vector/Storable/Mutable.hs
+++ b/Data/Vector/Storable/Mutable.hs
@@ -403,6 +403,11 @@ unsafeFromForeignPtr fp i n = unsafeFromForeignPtr0 fp' n
     where
       fp' = updPtr (`advancePtr` i) fp
 
+{-# RULES
+"unsafeFromForeignPtr fp 0 n -> unsafeFromForeignPtr0 fp n " forall fp n.
+  unsafeFromForeignPtr fp 0 n = unsafeFromForeignPtr0 fp n
+  #-}
+
 -- | /O(1)/ Create a mutable vector from a 'ForeignPtr' and a length.
 --
 -- It is assumed the pointer points directly to the data (no offset).