The following example shows that the lshr instruction is not properly folding, even though the involved operands (select and shift amount) are constant and could therefore be optimised into a single select instruction with shifted operands. Testing the optimisation with Alive2 seems to confirm the correctness.
I'm not familiar enough with the InstCombine code (yet), but it looked reasonable to call the SimplifySelectsFeedingBinaryOp method while visiting the shift instructions and enable it to handle the case where all the operands are constant, although I think this case could be handled differently because I noticed that changing the lshr instruction with other instructions (shl, xor) was properly folding the code (changing the value of the final constants as expected).
I would think SimplifySelectsFeedingBinaryOp() should be in commonShiftTransforms().