Another advantage of separating the instruction and data caches is that programs do not in general modify their own instruction. Thus, instruction caches can be designed as read-only devices that do not allow modification of the instructions they contain. This means that an instruction cache can simply discard any blocks that have to be evicted from it without writing them back to the main memory, since the data they contain is guaranteed not to have changed since it was brought into the cache. Finally, keeping the instruction and data caches separate prevents conflicts between blocks of instructions and data that might map into the same storage locations in a unified cache.