The arm condition codes for GE is N==V (and for LT is N!=V). If the source of flags cannot set V (overflow), such as a cmp against #0, then we can use the simpler PL and MI conditions that only check N. As these PL/MI conditions are simpler than GE/LT, other passes like the peephole optimiser can have a better time optimising away the redundant CMPs.
The exception is the VSEL instruction, which cannot take these codes, so there the transform favours GE. I have added some extra tests to codegen/arm/vsel.ll to check against 0 (which are not shown here because they do not change). Some of the other tests here have been updated, for which I am showing the difference.
isNullConstant