Index: llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp =================================================================== --- llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp +++ llvm/lib/Target/AMDGPU/AMDGPURemoveIncompatibleFunctions.cpp @@ -90,13 +90,14 @@ } constexpr unsigned FeaturesToCheck[] = { - AMDGPU::FeatureGFX11Insts, AMDGPU::FeatureGFX10Insts, - AMDGPU::FeatureGFX9Insts, AMDGPU::FeatureGFX8Insts, - AMDGPU::FeatureDPP, AMDGPU::Feature16BitInsts, - AMDGPU::FeatureDot1Insts, AMDGPU::FeatureDot2Insts, - AMDGPU::FeatureDot3Insts, AMDGPU::FeatureDot4Insts, - AMDGPU::FeatureDot5Insts, AMDGPU::FeatureDot6Insts, - AMDGPU::FeatureDot7Insts, AMDGPU::FeatureDot8Insts, + AMDGPU::FeatureGFX11Insts, AMDGPU::FeatureGFX10Insts, + AMDGPU::FeatureGFX9Insts, AMDGPU::FeatureGFX8Insts, + AMDGPU::FeatureDPP, AMDGPU::Feature16BitInsts, + AMDGPU::FeatureDot1Insts, AMDGPU::FeatureDot2Insts, + AMDGPU::FeatureDot3Insts, AMDGPU::FeatureDot4Insts, + AMDGPU::FeatureDot5Insts, AMDGPU::FeatureDot6Insts, + AMDGPU::FeatureDot7Insts, AMDGPU::FeatureDot8Insts, + AMDGPU::FeatureWavefrontSize32, AMDGPU::FeatureWavefrontSize64, }; FeatureBitset expandImpliedFeatures(const FeatureBitset &Features) { 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/test/CodeGen/AMDGPU/remove-incompatible-wave64-feature.ll =================================================================== --- /dev/null +++ llvm/test/CodeGen/AMDGPU/remove-incompatible-wave64-feature.ll @@ -0,0 +1,44 @@ +; 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: 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: llc -march=amdgcn -mcpu=gfx90a -mattr=+wavefrontsize64 -verify-machineinstrs < %s + +; RUN: llc -march=amdgcn -mcpu=gfx1011 -mattr=+wavefrontsize32 -stop-after=amdgpu-remove-incompatible-functions\ +; RUN: -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX10 %s +; RUN: FileCheck --check-prefix=WARN-GFX10 %s < %t +; RUN: llc -march=amdgcn -mcpu=gfx1011 -mattr=+wavefrontsize32 -verify-machineinstrs < %s + +; RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=+wavefrontsize32 -stop-after=amdgpu-remove-incompatible-functions\ +; RUN: -pass-remarks=amdgpu-remove-incompatible-functions < %s 2>%t | FileCheck -check-prefixes=GFX11 %s +; RUN: FileCheck --check-prefix=WARN-GFX11 %s < %t +; RUN: llc -march=amdgcn -mcpu=gfx1100 -mattr=+wavefrontsize32 -verify-machineinstrs < %s + +; WARN-GFX10: removing function 'needs_wavefrontsize64': +wavefrontsize64 is not supported on the current target +; WARN-GFX10-NOT: not supported + +; WARN-GFX11: removing function 'needs_wavefrontsize64': +wavefrontsize64 is not supported on the current target +; WARN-GFX11-NOT: not supported + +define void @needs_wavefrontsize64(ptr %out, i64 %a, i64 %b) #0 { +; GFX906: define void @needs_wavefrontsize64( +; GFX90A: define void @needs_wavefrontsize64( +; GFX10-NOT: @needs_wavefrontsize64 +; GFX11-NOT: @needs_wavefrontsize64 + %add = add i64 %a, %b + store i64 %add, ptr %out + ret void +} + +define void @caller(ptr %out, i64 %a, i64 %b) { + ; GFX906: call void @needs_wavefrontsize64( + ; GFX90A: call void @needs_wavefrontsize64( + ; GFX10: call void null( + ; GFX11: call void null( + call void @needs_wavefrontsize64(ptr %out, i64 %a, i64 %b) + ret void +} + +attributes #0 = { "target-features"="+wavefrontsize64" }