I was surprised to see that we're missing icmp folds based on 'add nsw' in InstCombine, but I think we should handle the 'InstSimplify' cases first because that could make the InstCombine code simpler.
Here's an attempt to prove the logic with Alive:
http://rise4fun.com/Alive/g5Q
gcc has had these kinds of folds since at least v4.4 based on:
https://godbolt.org/g/J1nh5Q