threadIdx.x and similar functions never return undef.
Simple enough to say, but why does it matter?
Consider the following IR that reads threadIdx.x and blockIdx.x.
%a = call i32 @llvm.nvvm.read.ptx.sreg.ctaid.x(), !range !138 %b = call i32 @llvm.nvvm.read.ptx.sreg.tid.x(), !range !139 %c = shl nuw nsw i32 %a, 6 %linear_index = or i32 %c, %b %linear_index.fr = freeze i32 %linear_index
If %a or %b may be undef, then computeKnownBits will not recurse through
the freeze instruction. Therefore we will not know anything about the
known bits of linear_index.fr, even though we have range metadata! Bad
Things fall out of this.