to step back through all of the previous instructions (up until the point it got pushed)
Hmm, this is very easy to do when the push and pop are in the same basic block. If they're in different blocks then things can get complicate. One thing that you should note about these temporaries is that they have limited lifetime. Once a temporary is popped it can be reused to store another value.
IMO, you're trying to get things working and optimize the code at the same time. I think it's better to just get things working first.