Mark threadIdx.x and friends as noundef.
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. Differential Revision: https://reviews.llvm.org/D147589
Loading
Please sign in to comment