[LoopVectorize] Use SetVector to track uniform uses to prevent non-determinism.
authorHuihui Zhang <huihuiz@quicinc.com>
Wed, 31 Mar 2021 17:58:36 +0000 (10:58 -0700)
committerHuihui Zhang <huihuiz@quicinc.com>
Wed, 31 Mar 2021 18:21:07 +0000 (11:21 -0700)
Use SetVector instead of SmallPtrSet to track values with uniform use. Doing this
can help avoid non-determinism caused by iterating over unordered containers.

This bug was found with reverse iteration turning on,
--extra-llvm-cmake-variables="-DLLVM_REVERSE_ITERATION=ON".
Failing LLVM test consecutive-ptr-uniforms.ll .

Reviewed By: MaskRay

Differential Revision: https://reviews.llvm.org/D99549

llvm/lib/Transforms/Vectorize/LoopVectorize.cpp

index e2ffb8d..15c53e0 100644 (file)
@@ -5413,7 +5413,7 @@ void LoopVectorizationCostModel::collectLoopUniforms(ElementCount VF) {
   // here is something which only demands lane 0 of the unrolled iterations;
   // it does not imply that all lanes produce the same value (e.g. this is not
   // the usual meaning of uniform)
-  SmallPtrSet<Value *, 8> HasUniformUse;
+  SetVector<Value *> HasUniformUse;
 
   // Scan the loop for instructions which are either a) known to have only
   // lane 0 demanded or b) are uses which demand only lane 0 of their operand.