The "Correlated Value Propagation" pass was missing a case when handling select instructions. It was only handling the "false" constant value, while in NVPTX the select may have the condition (and thus the branches) inverted, for example:
loop: %phi = phi i32* [ %sel, %loop ], [ %x, %entry ] %f = tail call i32* @f(i32* %phi) %cmp1 = icmp ne i32* %f, %y %sel = select i1 %cmp1, i32* %f, i32* null %cmp2 = icmp eq i32* %sel, null br i1 %cmp2, label %return, label %loop
But the select condition can be inverted:
%cmp1 = icmp eq i32* %f, %y %sel = select i1 %cmp1, i32* null, i32* %f
The fix is to enhance "Correlated Value Propagation" to handle both branches of the select instruction.