I find ShrinkWrap pass has two problems in the function useOrDefCSROrFI:
1. When a MI is a terminator, it doesn't return false immediately.
The tail call returns may clobber the CSRs, but should not treat as
use the CSRs.
2. When a MO is a register, it determines if it's used by checking
if it is inside the LastCalleeSavedAlias set. But I think its better
to check if it is inside the set returned by getCurrentCSRs.
getCurrentCSRs's return value comes from target frame lowering's
determineCalleeSaves. Actually, my project add some extra registers
got spilled as CSR at the entry of a function.
So, pay attention to these problems and thank you for a discussion.