separate needs an additional load, because the compiler currently thinks that the write to t.a invalidates the t.b value that it already loaded. So it needs to reload the t.b value instead of using the registerized value.
The extra instruction doesn't really matter - it's the extra load that matters.
This is a tricky problem to solve in general, because it requires some alias analysis. Perhaps something could be done for this simpler situation (different constant offsets from the same pointer).