[llvm] 663bb5a - [AMDGPU] Remove function if FeatureWavefrontSize 32 is not supported on current GPU

via llvm-commits llvm-commits at lists.llvm.org
Fri May 19 11:20:54 PDT 2023


Author: skc7
Date: 2023-05-19T23:49:01+05:30
New Revision: 663bb5a5f7ff2ba8db97f743168c094b0ee67f23

URL: https://github.com/llvm/llvm-project/commit/663bb5a5f7ff2ba8db97f743168c094b0ee67f23
DIFF: https://github.com/llvm/llvm-project/commit/663bb5a5f7ff2ba8db97f743168c094b0ee67f23.diff

LOG: [AMDGPU] Remove function if FeatureWavefrontSize 32 is not supported on current GPU

Reviewed By: arsenm, b-sumner

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

Added: 
    llvm/test/CodeGen/AMDGPU/remove-incompatible-wave32-feature.ll

Modified: 
    llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp b/llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
index ff43f4cb57e60..580352fb8cf44 100644
--- a/llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
+++ b/llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
@@ -107,6 +107,21 @@ FeatureBitset expandImpliedFeatures(const FeatureBitset &Features) {
   }
   return Result;
 }
+
+void reportFunctionRemoved(Function &F, unsigned Feature) {
+  OptimizationRemarkEmitter ORE(&F);
+  ORE.emit([&]() {
+    // Note: we print the function name as part of the diagnostic because if
+    // debug info is not present, users get "<unknown>:0:0" as the debug
+    // loc. If we didn't print the function name there would be no way to
+    // tell which function got removed.
+    return OptimizationRemark(DEBUG_TYPE, "AMDGPUIncompatibleFnRemoved", &F)
+           << "removing function '" << F.getName() << "': +"
+           << getFeatureName(Feature)
+           << " is not supported on the current target";
+  });
+  return;
+}
 } // end anonymous namespace
 
 bool AMDGPURemoveIncompatibleFunctions::checkFunction(Function &F) {
@@ -143,21 +158,20 @@ bool AMDGPURemoveIncompatibleFunctions::checkFunction(Function &F) {
   // GPU's feature set. We only check a predetermined set of features.
   for (unsigned Feature : FeaturesToCheck) {
     if (ST->hasFeature(Feature) && !GPUFeatureBits.test(Feature)) {
-      OptimizationRemarkEmitter ORE(&F);
-      ORE.emit([&]() {
-        // Note: we print the function name as part of the diagnostic because if
-        // debug info is not present, users get "<unknown>:0:0" as the debug
-        // loc. If we didn't print the function name there would be no way to
-        // tell which function got removed.
-        return OptimizationRemark(DEBUG_TYPE, "AMDGPUIncompatibleFnRemoved", &F)
-               << "removing function '" << F.getName() << "': +"
-               << getFeatureName(Feature)
-               << " is not supported on the current target";
-      });
+      reportFunctionRemoved(F, Feature);
       return true;
     }
   }
 
+  // Delete FeatureWavefrontSize32 functions for
+  // gfx9 and below targets that don't support the mode.
+  // gfx10+ is implied to support both wave32 and 64 features.
+  // They are not in the feature set. So, we need a separate check
+  if (ST->getGeneration() < AMDGPUSubtarget::GFX10 &&
+      ST->hasFeature(AMDGPU::FeatureWavefrontSize32)) {
+    reportFunctionRemoved(F, AMDGPU::FeatureWavefrontSize32);
+    return true;
+  }
   return false;
 }
 

diff  --git a/llvm/test/CodeGen/AMDGPU/remove-incompatible-wave32-feature.ll b/llvm/test/CodeGen/AMDGPU/remove-incompatible-wave32-feature.ll
new file mode 100644
index 0000000000000..afa768eaf3d5b
--- /dev/null
+++ b/llvm/test/CodeGen/AMDGPU/remove-incompatible-wave32-feature.ll
@@ -0,0 +1,50 @@
+; RUN: llc -march=amdgcn -mcpu=gfx906 -mattr=+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
+; RUN:   -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX906 %s
+; RUN: FileCheck --check-prefix=WARN-GFX906 %s < %t
+; RUN: llc -march=amdgcn -mcpu=gfx906 -mattr=+wavefrontsize64 -verify-machineinstrs < %s
+
+; RUN: llc -march=amdgcn -mcpu=gfx90a -mattr=+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
+; RUN:   -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX90A %s
+; RUN: FileCheck --check-prefix=WARN-GFX90A %s < %t
+; RUN: llc -march=amdgcn -mcpu=gfx90a -mattr=+wavefrontsize64 -verify-machineinstrs < %s
+
+; RUN: llc -march=amdgcn -mcpu=gfx1011 -mattr=+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
+; RUN:   -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX10 %s
+; RUN: llc -march=amdgcn -mcpu=gfx1011 -mattr=+wavefrontsize64 -verify-machineinstrs < %s
+
+; RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=+wavefrontsize64 -stop-after=amdgpu-remove-incompatible-functions\
+; RUN:   -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX11 %s
+; RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=+wavefrontsize64 -verify-machineinstrs < %s
+
+; WARN-GFX906: removing function 'needs_wavefrontsize32': +wavefrontsize32 is not supported on the current target
+; WARN-GFX906-NOT: not supported
+
+; WARN-GFX90A: removing function 'needs_wavefrontsize32': +wavefrontsize32 is not supported on the current target
+; WARN-GFX90A-NOT: not supported
+
+define void @needs_wavefrontsize32(ptr %out) #0 {
+; GFX906-NOT:   @needs_wavefrontsize32
+; GFX90A-NOT:   @needs_wavefrontsize32
+; GFX10:        define void @needs_wavefrontsize32(
+; GFX11:        define void @needs_wavefrontsize32(
+  %1 = tail call i32 @llvm.read_register.i32(metadata !0)
+  %2 = tail call i32 @llvm.ctpop.i32(i32 %1)
+  store i32 %2, ptr %out, align 4
+  ret void
+}
+
+define void @caller(ptr %out) {
+  ; GFX906: call void null(
+  ; GFX90A: call void null(
+  ; GFX10: call void @needs_wavefrontsize32(
+  ; GFX11: call void @needs_wavefrontsize32(
+  call void @needs_wavefrontsize32(ptr %out)
+  ret void
+}
+
+declare i32 @llvm.read_register.i32(metadata)
+declare i32 @llvm.ctpop.i32(i32)
+
+!0 = !{!"exec_lo"}
+
+attributes #0 = { "target-features"="+wavefrontsize32" }


        


More information about the llvm-commits mailing list