[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx commented: > Well, I'm not sure if my review is gating here, if "AMDGPU does not support > any libcalls at the moment" - it is what it is, no objections from my side. Since I am modifying the shared CodeGenInfo bit, it made sense to ask:) Also, I wasn't entirely certain that SPIRV advertising libcall support was intentional. https://github.com/llvm/llvm-project/pull/143814 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx closed https://github.com/llvm/llvm-project/pull/143814 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx edited https://github.com/llvm/llvm-project/pull/143814 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx updated
https://github.com/llvm/llvm-project/pull/143814
>From a976da9d6033a252fab75de216fe6580d6e3e6ff Mon Sep 17 00:00:00 2001
From: Alex Voicu
Date: Thu, 12 Jun 2025 00:47:43 +0100
Subject: [PATCH 1/2] Override `SPIRVTargetCodeGenInfo::supportsLibCall()` in
order to reflect AMDGCN's lack of support.
---
clang/lib/CodeGen/Targets/SPIR.cpp | 4 +
clang/test/CodeGen/logb_scalbn.c | 873 +
2 files changed, 877 insertions(+)
diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp
b/clang/lib/CodeGen/Targets/SPIR.cpp
index 2f1e43cdc8cc3..ebf983c15282b 100644
--- a/clang/lib/CodeGen/Targets/SPIR.cpp
+++ b/clang/lib/CodeGen/Targets/SPIR.cpp
@@ -75,6 +75,10 @@ class SPIRVTargetCodeGenInfo : public
CommonSPIRTargetCodeGenInfo {
SyncScope Scope,
llvm::AtomicOrdering Ordering,
llvm::LLVMContext &Ctx) const
override;
+ bool supportsLibCall() const override {
+return
+getABIInfo().getTarget().getTriple().getVendor() != llvm::Triple::AMD;
+ }
};
inline StringRef mapClangSyncScopeToLLVM(SyncScope Scope) {
diff --git a/clang/test/CodeGen/logb_scalbn.c b/clang/test/CodeGen/logb_scalbn.c
index be5e68b5fd4b0..52c52bcb292be 100644
--- a/clang/test/CodeGen/logb_scalbn.c
+++ b/clang/test/CodeGen/logb_scalbn.c
@@ -4,6 +4,11 @@
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=STRICT
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=MAYTRAP
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=ERRNO
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -emit-llvm %s | FileCheck
%s -check-prefixes=AMDGCNSPIRV-DEFAULT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=ignore -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-IGNORE
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-STRICT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-MAYTRAP
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=AMDGCNSPIRV-ERRNO
// DEFAULT-LABEL: define dso_local void @test_logbf(
// DEFAULT-SAME: ) #[[ATTR0:[0-9]+]] {
@@ -78,6 +83,79 @@
// ERRNO-NEXT:store float [[CALL]], ptr [[D1_ASCAST]], align 4
// ERRNO-NEXT:ret void
//
+// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]]
to ptr addrspace(4)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32
} @llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP3:%.*]] = sitofp i32 [[TMP2]] to float
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP4:%.*]] = call addrspace(4) float
@llvm.fabs.f32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP5:%.*]] = fcmp one float [[TMP4]],
0x7FF0
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP6:%.*]] = select i1 [[TMP5]], float
[[TMP3]], float [[TMP4]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP7:%.*]] = select i1 false, float
0xFFF0, float [[TMP6]]
+// AMDGCNSPIRV-DEFAULT-NEXT:store float [[TMP7]], ptr addrspace(4)
[[D1_ASCAST]], align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:ret void
+//
+// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to
ptr addrspace(4)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32 }
@llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP3:%.*]] = sitofp i32 [[TMP2]] to float
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP4:%.*]] = call addrspace(4) float
@llvm.fabs.f32(float 0x40301999A000)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP5:%.*]] = fcmp one float [[TMP4]],
0x7FF0
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP6:%.*]] = select i1 [[TMP5]], float
[[TMP3]], fl
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx updated
https://github.com/llvm/llvm-project/pull/143814
>From a976da9d6033a252fab75de216fe6580d6e3e6ff Mon Sep 17 00:00:00 2001
From: Alex Voicu
Date: Thu, 12 Jun 2025 00:47:43 +0100
Subject: [PATCH 1/2] Override `SPIRVTargetCodeGenInfo::supportsLibCall()` in
order to reflect AMDGCN's lack of support.
---
clang/lib/CodeGen/Targets/SPIR.cpp | 4 +
clang/test/CodeGen/logb_scalbn.c | 873 +
2 files changed, 877 insertions(+)
diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp
b/clang/lib/CodeGen/Targets/SPIR.cpp
index 2f1e43cdc8cc3..ebf983c15282b 100644
--- a/clang/lib/CodeGen/Targets/SPIR.cpp
+++ b/clang/lib/CodeGen/Targets/SPIR.cpp
@@ -75,6 +75,10 @@ class SPIRVTargetCodeGenInfo : public
CommonSPIRTargetCodeGenInfo {
SyncScope Scope,
llvm::AtomicOrdering Ordering,
llvm::LLVMContext &Ctx) const
override;
+ bool supportsLibCall() const override {
+return
+getABIInfo().getTarget().getTriple().getVendor() != llvm::Triple::AMD;
+ }
};
inline StringRef mapClangSyncScopeToLLVM(SyncScope Scope) {
diff --git a/clang/test/CodeGen/logb_scalbn.c b/clang/test/CodeGen/logb_scalbn.c
index be5e68b5fd4b0..52c52bcb292be 100644
--- a/clang/test/CodeGen/logb_scalbn.c
+++ b/clang/test/CodeGen/logb_scalbn.c
@@ -4,6 +4,11 @@
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=STRICT
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=MAYTRAP
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=ERRNO
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -emit-llvm %s | FileCheck
%s -check-prefixes=AMDGCNSPIRV-DEFAULT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=ignore -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-IGNORE
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-STRICT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-MAYTRAP
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=AMDGCNSPIRV-ERRNO
// DEFAULT-LABEL: define dso_local void @test_logbf(
// DEFAULT-SAME: ) #[[ATTR0:[0-9]+]] {
@@ -78,6 +83,79 @@
// ERRNO-NEXT:store float [[CALL]], ptr [[D1_ASCAST]], align 4
// ERRNO-NEXT:ret void
//
+// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]]
to ptr addrspace(4)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32
} @llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP3:%.*]] = sitofp i32 [[TMP2]] to float
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP4:%.*]] = call addrspace(4) float
@llvm.fabs.f32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP5:%.*]] = fcmp one float [[TMP4]],
0x7FF0
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP6:%.*]] = select i1 [[TMP5]], float
[[TMP3]], float [[TMP4]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP7:%.*]] = select i1 false, float
0xFFF0, float [[TMP6]]
+// AMDGCNSPIRV-DEFAULT-NEXT:store float [[TMP7]], ptr addrspace(4)
[[D1_ASCAST]], align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:ret void
+//
+// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to
ptr addrspace(4)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32 }
@llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP3:%.*]] = sitofp i32 [[TMP2]] to float
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP4:%.*]] = call addrspace(4) float
@llvm.fabs.f32(float 0x40301999A000)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP5:%.*]] = fcmp one float [[TMP4]],
0x7FF0
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP6:%.*]] = select i1 [[TMP5]], float
[[TMP3]], fl
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx commented: #143431 is related to this, but it proposes a more pervasive change, which would require further discussion and clarification around what the SPIR-V BE wants to do / support in term of libcalls. https://github.com/llvm/llvm-project/pull/143814 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx edited https://github.com/llvm/llvm-project/pull/143814 ___ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
github-actions[bot] wrote:
:warning: C/C++ code formatter, clang-format found issues in your code.
:warning:
You can test this locally with the following command:
``bash
git-clang-format --diff HEAD~1 HEAD --extensions c,cpp --
clang/lib/CodeGen/Targets/SPIR.cpp clang/test/CodeGen/logb_scalbn.c
``
View the diff from clang-format here.
``diff
diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp
b/clang/lib/CodeGen/Targets/SPIR.cpp
index ebf983c15..5918f878c 100644
--- a/clang/lib/CodeGen/Targets/SPIR.cpp
+++ b/clang/lib/CodeGen/Targets/SPIR.cpp
@@ -76,8 +76,8 @@ public:
llvm::AtomicOrdering Ordering,
llvm::LLVMContext &Ctx) const
override;
bool supportsLibCall() const override {
-return
-getABIInfo().getTarget().getTriple().getVendor() != llvm::Triple::AMD;
+return getABIInfo().getTarget().getTriple().getVendor() !=
+ llvm::Triple::AMD;
}
};
``
https://github.com/llvm/llvm-project/pull/143814
___
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
llvmbot wrote:
@llvm/pr-subscribers-clang
@llvm/pr-subscribers-clang-codegen
Author: Alex Voicu (AlexVlx)
Changes
The `supportsLibCall` predicate is used to select whether some math builtins
get expanded in the FE or they get lowered into libcalls. The default
implementation unconditionally returns true, which is problematic for
AMDGCN-flavoured SPIRV, as AMDGPU does not support any libcalls at the moment.
This change overrides the predicate in order to reflect this and correctly do
the expected FE expansion when targeting AMDGCN-flavoured SPIRV.
---
Patch is 70.83 KiB, truncated to 20.00 KiB below, full version:
https://github.com/llvm/llvm-project/pull/143814.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/Targets/SPIR.cpp (+4)
- (modified) clang/test/CodeGen/logb_scalbn.c (+873)
``diff
diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp
b/clang/lib/CodeGen/Targets/SPIR.cpp
index 2f1e43cdc8cc3..ebf983c15282b 100644
--- a/clang/lib/CodeGen/Targets/SPIR.cpp
+++ b/clang/lib/CodeGen/Targets/SPIR.cpp
@@ -75,6 +75,10 @@ class SPIRVTargetCodeGenInfo : public
CommonSPIRTargetCodeGenInfo {
SyncScope Scope,
llvm::AtomicOrdering Ordering,
llvm::LLVMContext &Ctx) const
override;
+ bool supportsLibCall() const override {
+return
+getABIInfo().getTarget().getTriple().getVendor() != llvm::Triple::AMD;
+ }
};
inline StringRef mapClangSyncScopeToLLVM(SyncScope Scope) {
diff --git a/clang/test/CodeGen/logb_scalbn.c b/clang/test/CodeGen/logb_scalbn.c
index be5e68b5fd4b0..52c52bcb292be 100644
--- a/clang/test/CodeGen/logb_scalbn.c
+++ b/clang/test/CodeGen/logb_scalbn.c
@@ -4,6 +4,11 @@
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=STRICT
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=MAYTRAP
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=ERRNO
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -emit-llvm %s | FileCheck
%s -check-prefixes=AMDGCNSPIRV-DEFAULT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=ignore -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-IGNORE
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-STRICT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-MAYTRAP
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=AMDGCNSPIRV-ERRNO
// DEFAULT-LABEL: define dso_local void @test_logbf(
// DEFAULT-SAME: ) #[[ATTR0:[0-9]+]] {
@@ -78,6 +83,79 @@
// ERRNO-NEXT:store float [[CALL]], ptr [[D1_ASCAST]], align 4
// ERRNO-NEXT:ret void
//
+// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]]
to ptr addrspace(4)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32
} @llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP3:%.*]] = sitofp i32 [[TMP2]] to float
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP4:%.*]] = call addrspace(4) float
@llvm.fabs.f32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP5:%.*]] = fcmp one float [[TMP4]],
0x7FF0
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP6:%.*]] = select i1 [[TMP5]], float
[[TMP3]], float [[TMP4]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP7:%.*]] = select i1 false, float
0xFFF0, float [[TMP6]]
+// AMDGCNSPIRV-DEFAULT-NEXT:store float [[TMP7]], ptr addrspace(4)
[[D1_ASCAST]], align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:ret void
+//
+// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to
ptr addrspace(4)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32 }
@llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-IGNORE-
[clang] [Clang][SPIRV][AMDGPU] Override `supportsLibCall` for AMDGCNSPIRV (PR #143814)
https://github.com/AlexVlx created
https://github.com/llvm/llvm-project/pull/143814
The `supportsLibCall` predicate is used to select whether some math builtins
get expanded in the FE or they get lowered into libcalls. The default
implementation unconditionally returns true, which is problematic for
AMDGCN-flavoured SPIRV, as AMDGPU does not support any libcalls at the moment.
This change overrides the predicate in order to reflect this and correctly do
the expected FE expansion when targeting AMDGCN-flavoured SPIRV.
>From a976da9d6033a252fab75de216fe6580d6e3e6ff Mon Sep 17 00:00:00 2001
From: Alex Voicu
Date: Thu, 12 Jun 2025 00:47:43 +0100
Subject: [PATCH] Override `SPIRVTargetCodeGenInfo::supportsLibCall()` in order
to reflect AMDGCN's lack of support.
---
clang/lib/CodeGen/Targets/SPIR.cpp | 4 +
clang/test/CodeGen/logb_scalbn.c | 873 +
2 files changed, 877 insertions(+)
diff --git a/clang/lib/CodeGen/Targets/SPIR.cpp
b/clang/lib/CodeGen/Targets/SPIR.cpp
index 2f1e43cdc8cc3..ebf983c15282b 100644
--- a/clang/lib/CodeGen/Targets/SPIR.cpp
+++ b/clang/lib/CodeGen/Targets/SPIR.cpp
@@ -75,6 +75,10 @@ class SPIRVTargetCodeGenInfo : public
CommonSPIRTargetCodeGenInfo {
SyncScope Scope,
llvm::AtomicOrdering Ordering,
llvm::LLVMContext &Ctx) const
override;
+ bool supportsLibCall() const override {
+return
+getABIInfo().getTarget().getTriple().getVendor() != llvm::Triple::AMD;
+ }
};
inline StringRef mapClangSyncScopeToLLVM(SyncScope Scope) {
diff --git a/clang/test/CodeGen/logb_scalbn.c b/clang/test/CodeGen/logb_scalbn.c
index be5e68b5fd4b0..52c52bcb292be 100644
--- a/clang/test/CodeGen/logb_scalbn.c
+++ b/clang/test/CodeGen/logb_scalbn.c
@@ -4,6 +4,11 @@
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=STRICT
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=MAYTRAP
// RUN: %clang -cc1 -triple amdgcn-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=ERRNO
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -emit-llvm %s | FileCheck
%s -check-prefixes=AMDGCNSPIRV-DEFAULT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=ignore -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-IGNORE
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=strict -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-STRICT
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o -
-ffp-exception-behavior=maytrap -emit-llvm %s | FileCheck %s
-check-prefixes=AMDGCNSPIRV-MAYTRAP
+// RUN: %clang -cc1 -triple spirv64-amd-amdhsa -o - -fmath-errno -emit-llvm %s
| FileCheck %s -check-prefixes=AMDGCNSPIRV-ERRNO
// DEFAULT-LABEL: define dso_local void @test_logbf(
// DEFAULT-SAME: ) #[[ATTR0:[0-9]+]] {
@@ -78,6 +83,79 @@
// ERRNO-NEXT:store float [[CALL]], ptr [[D1_ASCAST]], align 4
// ERRNO-NEXT:ret void
//
+// AMDGCNSPIRV-DEFAULT-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-DEFAULT-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-DEFAULT-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]]
to ptr addrspace(4)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32
} @llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]], 1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP2:%.*]] = add nsw i32 [[TMP1]], -1
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP3:%.*]] = sitofp i32 [[TMP2]] to float
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP4:%.*]] = call addrspace(4) float
@llvm.fabs.f32(float 0x40301999A000)
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP5:%.*]] = fcmp one float [[TMP4]],
0x7FF0
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP6:%.*]] = select i1 [[TMP5]], float
[[TMP3]], float [[TMP4]]
+// AMDGCNSPIRV-DEFAULT-NEXT:[[TMP7:%.*]] = select i1 false, float
0xFFF0, float [[TMP6]]
+// AMDGCNSPIRV-DEFAULT-NEXT:store float [[TMP7]], ptr addrspace(4)
[[D1_ASCAST]], align 4
+// AMDGCNSPIRV-DEFAULT-NEXT:ret void
+//
+// AMDGCNSPIRV-IGNORE-LABEL: define spir_func void @test_logbf(
+// AMDGCNSPIRV-IGNORE-SAME: ) addrspace(4) #[[ATTR0:[0-9]+]] {
+// AMDGCNSPIRV-IGNORE-NEXT: [[ENTRY:.*:]]
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1:%.*]] = alloca float, align 4
+// AMDGCNSPIRV-IGNORE-NEXT:[[D1_ASCAST:%.*]] = addrspacecast ptr [[D1]] to
ptr addrspace(4)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP0:%.*]] = call addrspace(4) { float, i32 }
@llvm.frexp.f32.i32(float 0x40301999A000)
+// AMDGCNSPIRV-IGNORE-NEXT:[[TMP1:%.*]] = extractvalue { float, i32 }
[[TMP0]],
