Compilers use various methods to track and represent the effects of IR instructions, including bitsets and heap range lists, to enable optimizations such as dead code elimination and instruction reordering. Different compilers, such as Cinder, JavaScriptCore, and Simple, use different approaches to represent effects, with some using bitsets and others using int ranges or abstract heaps.