https://github.com/shiltian created https://github.com/llvm/llvm-project/pull/207632
None >From 5ed0716d049a86579ff527056a60eaac6d028f86 Mon Sep 17 00:00:00 2001 From: Shilei Tian <[email protected]> Date: Sat, 4 Jul 2026 18:12:47 -0400 Subject: [PATCH] [AMDGPU] Add FUNC_WGP_MODE for object linking info flag --- llvm/docs/AMDGPUUsage.rst | 1 + .../llvm/Support/AMDGPUObjLinkingInfo.h | 4 +++- llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp | 1 + .../AMDGPU/AsmParser/AMDGPUAsmParser.cpp | 1 + .../MCTargetDesc/AMDGPUTargetStreamer.cpp | 4 ++++ .../AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h | 1 + .../CodeGen/AMDGPU/lds-link-time-codegen.ll | 18 ++++++++++++++++++ llvm/test/MC/AMDGPU/amdgpu-info-roundtrip.s | 10 +++++----- 8 files changed, 34 insertions(+), 6 deletions(-) diff --git a/llvm/docs/AMDGPUUsage.rst b/llvm/docs/AMDGPUUsage.rst index 85a685c246655..69a3cc894c13f 100644 --- a/llvm/docs/AMDGPUUsage.rst +++ b/llvm/docs/AMDGPUUsage.rst @@ -3249,6 +3249,7 @@ if needed. 0x1 ``FUNC_USES_VCC`` Function uses the VCC register 0x2 ``FUNC_USES_FLAT_SCRATCH`` Function uses flat scratch addressing 0x4 ``FUNC_HAS_DYN_STACK`` Function has dynamic stack allocation + 0x8 ``FUNC_WGP_MODE`` Function uses WGP execution mode ===== =========================== ========================================== Symbol references (``INFO_FUNC``, ``INFO_USE``, ``INFO_CALL``) generate diff --git a/llvm/include/llvm/Support/AMDGPUObjLinkingInfo.h b/llvm/include/llvm/Support/AMDGPUObjLinkingInfo.h index ef71e836bfc40..7d36eb08fa620 100644 --- a/llvm/include/llvm/Support/AMDGPUObjLinkingInfo.h +++ b/llvm/include/llvm/Support/AMDGPUObjLinkingInfo.h @@ -68,7 +68,9 @@ enum class FuncInfoFlags : uint32_t { FUNC_USES_VCC = 1U << 0, FUNC_USES_FLAT_SCRATCH = 1U << 1, FUNC_HAS_DYN_STACK = 1U << 2, - LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/FUNC_HAS_DYN_STACK), + /// Function uses WGP mode. If unset, the function uses CU mode. + FUNC_WGP_MODE = 1U << 3, + LLVM_MARK_AS_BITMASK_ENUM(/*LargestValue=*/FUNC_WGP_MODE), }; } // namespace AMDGPU diff --git a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp index e9c669d744a5c..10e9d5414353c 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUAsmPrinter.cpp @@ -958,6 +958,7 @@ bool AMDGPUAsmPrinter::runOnMachineFunction(MachineFunction &MF) { /*NumAccVGPR=*/static_cast<uint32_t>(RU.NumAGPR), /*PrivateSegmentSize=*/static_cast<uint32_t>(RU.PrivateSegmentSize), /*Occupancy=*/Occupancy, + /*UsesWgpMode=*/STM.supportsWGP() && !STM.isCuModeEnabled(), /*UsesVCC=*/RU.UsesVCC, /*UsesFlatScratch=*/RU.UsesFlatScratch, /*HasDynStack=*/RU.HasDynamicallySizedStack, diff --git a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp index 22ed4bfc22ab1..55150cae4a253 100644 --- a/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp +++ b/llvm/lib/Target/AMDGPU/AsmParser/AMDGPUAsmParser.cpp @@ -6905,6 +6905,7 @@ bool AMDGPUAsmParser::ParseDirectiveAMDGPUInfo() { FI.UsesFlatScratch = !!(Flags & AMDGPU::FuncInfoFlags::FUNC_USES_FLAT_SCRATCH); FI.HasDynStack = !!(Flags & AMDGPU::FuncInfoFlags::FUNC_HAS_DYN_STACK); + FI.UsesWgpMode = !!(Flags & AMDGPU::FuncInfoFlags::FUNC_WGP_MODE); HasScalarAttrs = true; } else if (Dir == "num_sgpr") { int64_t Val; diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp index a72d38def748c..bbc9a7def0d77 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.cpp @@ -751,6 +751,8 @@ void AMDGPUTargetAsmStreamer::emitAMDGPUInfo( Flags |= AMDGPU::FuncInfoFlags::FUNC_USES_FLAT_SCRATCH; if (Info->HasDynStack) Flags |= AMDGPU::FuncInfoFlags::FUNC_HAS_DYN_STACK; + if (Info->UsesWgpMode) + Flags |= AMDGPU::FuncInfoFlags::FUNC_WGP_MODE; OS << "\t\t.amdgpu_flags " << llvm::to_underlying(Flags) << '\n'; OS << "\t\t.amdgpu_num_sgpr " << Info->NumSGPR << '\n'; OS << "\t\t.amdgpu_num_vgpr " << Info->NumArchVGPR << '\n'; @@ -1225,6 +1227,8 @@ void AMDGPUTargetELFStreamer::emitAMDGPUInfo( Flags |= AMDGPU::FuncInfoFlags::FUNC_USES_FLAT_SCRATCH; if (Info->HasDynStack) Flags |= AMDGPU::FuncInfoFlags::FUNC_HAS_DYN_STACK; + if (Info->UsesWgpMode) + Flags |= AMDGPU::FuncInfoFlags::FUNC_WGP_MODE; EmitU32Entry(AMDGPU::InfoKind::INFO_FLAGS, llvm::to_underlying(Flags)); EmitU32Entry(AMDGPU::InfoKind::INFO_NUM_SGPR, Info->NumSGPR); EmitU32Entry(AMDGPU::InfoKind::INFO_NUM_VGPR, Info->NumArchVGPR); diff --git a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h index dd0759c573606..581bc185b24c9 100644 --- a/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h +++ b/llvm/lib/Target/AMDGPU/MCTargetDesc/AMDGPUTargetStreamer.h @@ -36,6 +36,7 @@ struct FuncInfo { uint32_t NumAccVGPR = 0; uint32_t PrivateSegmentSize = 0; uint32_t Occupancy = 0; + bool UsesWgpMode = false; bool UsesVCC = false; bool UsesFlatScratch = false; bool HasDynStack = false; diff --git a/llvm/test/CodeGen/AMDGPU/lds-link-time-codegen.ll b/llvm/test/CodeGen/AMDGPU/lds-link-time-codegen.ll index 0020c2272d23e..646248bbbf97b 100644 --- a/llvm/test/CodeGen/AMDGPU/lds-link-time-codegen.ll +++ b/llvm/test/CodeGen/AMDGPU/lds-link-time-codegen.ll @@ -1,5 +1,9 @@ ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-enable-object-linking < %s | FileCheck -check-prefixes=ASM %s --implicit-check-not=.amdgpu_num_agpr ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -amdgpu-enable-object-linking -filetype=obj < %s | llvm-readobj -r --syms --sections - | FileCheck -check-prefixes=ELF %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -amdgpu-enable-object-linking -filetype=asm < %s | FileCheck -check-prefixes=WGP %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+wavefrontsize64 -amdgpu-enable-object-linking -filetype=asm < %s | FileCheck -check-prefixes=WGP %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode -amdgpu-enable-object-linking -filetype=asm < %s | FileCheck -check-prefixes=CU %s +; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+cumode,+wavefrontsize64 -amdgpu-enable-object-linking -filetype=asm < %s | FileCheck -check-prefixes=CU %s ; Test that with object linking enabled, external LDS declarations produce ; @abs32@lo relocations, SHN_AMDGPU_LDS symbols, .amdgpu_lds directives, @@ -38,6 +42,20 @@ ; ASM-DAG: .amdgpu_call device_func ; ASM-DAG: .end_amdgpu_info +; COM: FUNC_WGP_MODE (0x8): WGP mode is the default on a WGP-capable target +; COM: (gfx11), so the flag is set on every function; +cumode selects CU mode +; COM: and clears it. Checked for both +wavefrontsize32 (default) and +; COM: +wavefrontsize64. +; WGP: .amdgpu_info device_func +; WGP-NEXT: .amdgpu_flags 8 +; WGP: .amdgpu_info test_kernel +; WGP-NEXT: .amdgpu_flags 8 + +; CU: .amdgpu_info device_func +; CU-NEXT: .amdgpu_flags 0 +; CU: .amdgpu_info test_kernel +; CU-NEXT: .amdgpu_flags 0 + ; SHN_AMDGPU_LDS directives. ; ASM-DAG: .amdgpu_lds lds_large, 256, 16 ; ASM-DAG: .amdgpu_lds lds_small, 128, 4 diff --git a/llvm/test/MC/AMDGPU/amdgpu-info-roundtrip.s b/llvm/test/MC/AMDGPU/amdgpu-info-roundtrip.s index 72406e3ad60a6..85ba86d5918d7 100644 --- a/llvm/test/MC/AMDGPU/amdgpu-info-roundtrip.s +++ b/llvm/test/MC/AMDGPU/amdgpu-info-roundtrip.s @@ -31,11 +31,11 @@ addr_taken_func: .globl extern_func -// COM: Kernel: flags=7 (KERNEL|VCC|FLAT_SCRATCH), resources, call edge, use -// COM: edge, indirect call, and type ID. Non-zero AGPR to verify conditional -// COM: emission. +// COM: Kernel: flags=15 (VCC|FLAT_SCRATCH|HAS_DYN_STACK|WGP_MODE), resources, +// COM: call edge, use edge, indirect call, and type ID. Non-zero AGPR to verify +// COM: conditional emission. .amdgpu_info my_kernel - .amdgpu_flags 7 + .amdgpu_flags 15 .amdgpu_num_sgpr 33 .amdgpu_num_vgpr 32 .amdgpu_num_agpr 4 @@ -69,7 +69,7 @@ addr_taken_func: .end_amdgpu_info // ASM: .amdgpu_info my_kernel -// ASM: .amdgpu_flags 7 +// ASM: .amdgpu_flags 15 // ASM: .amdgpu_num_sgpr 33 // ASM: .amdgpu_num_vgpr 32 // ASM: .amdgpu_num_agpr 4 _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
