When enabling IPRA on SystemZ, a benchmark crashed and I found out that a function had been optimized to not save the Callee Saved Registers, which unfortunately included the return register (%r14) on SystemZ, so when the function tried to return UB resulted.
To fix this, I beleive SystemZFrameLowering::determineCalleeSaves() needs to add R14D to SavedRegs. I also think the DP should be added (R11), in case the calling function uses DP, right?
In SystemZFrameLowering::determineCalleeSaves(), the first call to TargetFrameLowering::determineCalleeSaves(MF, SavedRegs, RS) will not add any registers to SavedRegs if
// When interprocedural register allocation is enabled caller saved registers // are preferred over callee saved registers. if (MF.getTarget().Options.EnableIPRA && isSafeForNoCSROpt(MF.getFunction())) return;
So, the question then is what registers we must save in this case, and which we in fact do not have to save, to get better performance with IPRA. So far, I have come to the conclusion that all the specially treated registers that SystemZFrameLowering::determineCalleeSaves is already adding needs to be saved with IPRA.
I made two tests - one each for R11 and R14. For some reason I could not process the debug output without doing a separate run for it.
From last comment by @uweigand it seems that the actual bug is here shouldn't hasCall() for systemZ detect instructions which modifies R14 except load instruction?