I've setup the basic framework for the isGuaranteedNotToBeUndefOrPoison call and updated DAGCombiner::visitFREEZE to use it, further Opcodes can be handled when we have test coverage.
I'm not aware of any vector test freeze coverage so the DemandedElts (and the Depth) args are not being used yet - but they are in place.
I think I'd like to have a separate isGuaranteedNotToBePoison entry point, so code consuming this API doesn't have to explicitly pass the "PoisonOnly" flag. (Sharing the implementation is fine.)
Doesn't have to be in this patch, though.