[llvm] [TTI] Introduce getInstructionUniformity API for flexible uniformity analysis (PR #137639)
Jay Foad via llvm-commits
llvm-commits at lists.llvm.org
Thu Nov 20 06:08:19 PST 2025
================
@@ -1574,3 +1575,55 @@ unsigned GCNTTIImpl::getNumberOfParts(Type *Tp) const {
}
return BaseT::getNumberOfParts(Tp);
}
+
+// New API that wraps the old isSourceOfDivergence and isAlwaysUniform APIs
+// with additional support for new uniformity classifications
+InstructionUniformity
+GCNTTIImpl::getInstructionUniformity(const Value *V) const {
+ // Check for special cases requiring custom uniformity analysis
+ if (const IntrinsicInst *Intrinsic = dyn_cast<IntrinsicInst>(V)) {
+ switch (Intrinsic->getIntrinsicID()) {
+ case Intrinsic::amdgcn_permlane16:
+ case Intrinsic::amdgcn_permlanex16:
+ return InstructionUniformity::Custom;
+ default:
+ break;
+ }
+ }
+
+ // Delegate to old APIs for backward compatibility
+ if (isAlwaysUniform(V))
+ return InstructionUniformity::AlwaysUniform;
+
+ // Check if source of divergence
+ if (isSourceOfDivergence(V))
+ return InstructionUniformity::NeverUniform;
+
+ // Default behavior
+ return InstructionUniformity::Default;
+}
+
+bool GCNTTIImpl::isUniform(const Instruction *I,
+ const SmallBitVector &UniformArgs) const {
+ // Custom uniformity check for permlane16/permlanex16
+ if (const IntrinsicInst *Intrinsic = dyn_cast<IntrinsicInst>(I)) {
+ switch (Intrinsic->getIntrinsicID()) {
+ case Intrinsic::amdgcn_permlane16:
+ case Intrinsic::amdgcn_permlanex16:
+ // For permlane16/permlanex16:
+ // Operand 0: old value (ignored for uniformity)
+ // Operand 1: src0 (source value to permute)
+ // Operand 2: src1 (lane select within 16-lane group)
+ // Operand 3: src2 (which 16-lane group)
+ // Result is uniform if either src0 (op 1) or src1 (op 2) is uniform
----------------
jayfoad wrote:
As Nicolai pointed out this is completely wrong and permlane16 is the wrong example to use to demonstrate the new functionality.
https://github.com/llvm/llvm-project/pull/137639
More information about the llvm-commits
mailing list