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

krishna chaitanya sankisa via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Thu May 4 20:11:01 PDT 2023


skc7 updated this revision to Diff 519730.
skc7 retitled this revision from "[AMDGPU] Remove function if FeatureWavefrontSize 32/64 is not supported on current GPU" to "[AMDGPU] Remove function if FeatureWavefrontSize 32 is not supported on current GPU".
skc7 edited the summary of this revision.
skc7 added a comment.

expandImpliedFeatures gets all the features implied by current GPU. But wavefrontsize32 and 64 are not part of the feature list for gfx10 and above targets in AMDGPU.td. AFAIU, It is assumed those subtarget supports both the features if they are not part of the list. So GPUFeatureBits cannot be relied on to query FeatureWavefrontSize32/64.

In the latest revision, made changes to delete FeatureWavefrontSize32 functions for gfx9 and below targets that don't support the mode


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D148906/new/

https://reviews.llvm.org/D148906

Files:
  llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
  llvm/test/CodeGen/AMDGPU/remove-incompatible-wave32-feature.ll


Index: llvm/test/CodeGen/AMDGPU/remove-incompatible-wave32-feature.ll
===================================================================
--- /dev/null
+++ 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" }
Index: llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
===================================================================
--- llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
+++ llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp
@@ -158,6 +158,20 @@
     }
   }
 
+  // Delete FeatureWavefrontSize32 functions for
+  // gfx9 and below targets that don't support the mode
+  bool IsGfx9AndBelow = ST->getGeneration() < AMDGPUSubtarget::GFX10;
+  unsigned Wave32Feature = AMDGPU::FeatureWavefrontSize32;
+  if (IsGfx9AndBelow && ST->hasFeature(Wave32Feature)) {
+    OptimizationRemarkEmitter ORE(&F);
+    ORE.emit([&]() {
+      return OptimizationRemark(DEBUG_TYPE, "AMDGPUIncompatibleFnRemoved", &F)
+             << "removing function '" << F.getName() << "': +"
+             << getFeatureName(Wave32Feature)
+             << " is not supported on the current target";
+    });
+    return true;
+  }
   return false;
 }
 


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D148906.519730.patch
Type: text/x-patch
Size: 3669 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230505/30874f46/attachment.bin>


More information about the llvm-commits mailing list