my view is the "undefined" is a broad term that encompasses undef and poison, so this probably doesn't require rewording
however, is_zero_undef is specifically referring to undef, and should be changed to is_zero_poison (or, perhaps, is_zero_undefined)
As a justification why it doesn't matter whether it's undef or poison, clang emits__builtin_ffs as:
ffs(x) -> x ? cttz(x) + 1 : 0
So I support this change to poison, since it makes things easier than undef.
That's a good point. I agree the current documentation of poison is outdated; it misses a rule for select. "select a, b, c" is only poison if a=1 and b is poison or a=0 and c is poison.