diff --git a/llvm/include/llvm/ADT/GenericUniformityImpl.h b/llvm/include/llvm/ADT/GenericUniformityImpl.h --- a/llvm/include/llvm/ADT/GenericUniformityImpl.h +++ b/llvm/include/llvm/ADT/GenericUniformityImpl.h @@ -1264,6 +1264,11 @@ return DA->isDivergent(V); } +template +bool GenericUniformityInfo::isDivergent(const InstructionT *I) const { + return DA->isDivergent(*I); +} + template bool GenericUniformityInfo::hasDivergentTerminator(const BlockT &B) { return DA->hasDivergentTerminator(B); diff --git a/llvm/include/llvm/ADT/GenericUniformityInfo.h b/llvm/include/llvm/ADT/GenericUniformityInfo.h --- a/llvm/include/llvm/ADT/GenericUniformityInfo.h +++ b/llvm/include/llvm/ADT/GenericUniformityInfo.h @@ -62,6 +62,13 @@ /// Whether \p V is uniform/non-divergent. bool isUniform(ConstValueRefT V) const { return !isDivergent(V); } + // Similar queries for InstructionT. These accept a pointer argument so that + // in LLVM IR, they overload the equivalent queries for Value*. For example, + // if querying whether a BranchInst is divergent, it should not be treated as + // a Value in LLVM IR. + bool isUniform(const InstructionT *I) const { return !isDivergent(I); }; + bool isDivergent(const InstructionT *I) const; + bool hasDivergentTerminator(const BlockT &B); void print(raw_ostream &Out) const;