Qeustion of poison produced by shift instruction?

The reason oversize shifts are poison was originally based on the C standard: it’s undefined behavior in C, so it should be the same in IR. It wasn’t really based on the behavior of any specific instruction-set. This also turns out to be convenient for the optimizer: it’s easy to reason about, so optimizations on shifts are easier to write, and more effective.

For some other operations with undefined behavior, we’ve added alternate intrinsics that don’t have undefined behavior… for example, there’s a saturating version of fptoui. But nobody has requested that for shifts; frontends generating LLVM IR can usually just mask the shift amount, and backends pattern-match that where they can.