According to what I've read, in GHC there are only four STG registers that are mapped to fixed registers in the x86 backend (and only one of them can contain a value). All roots are guaranteed to be either in this STG register or in the STG stack, which is kept separate from the C stack and is tagged with pointer/nonpointer info. This is certainly an option, but it seems suboptimal to me; we want LLVM to have the freedom to assign registers as it likes.