https://github.com/keshavvinayak01 created
https://github.com/llvm/llvm-project/pull/218356
Clang currently doesn't inform the optimizer that constant address space loads
are constant. They should all be markable with the `!invariant.load` metadata.
This isn't currently done:
```cpp
kernel void constant_load_invariant_metadata(global int* out, global int *k) {
out[0] = k[0];
}
```
Produces this IR:
```
define amdgpu_kernel void @constant_load_invariant_metadata(i32 addrspace(1)*
nocapture %out, i32 addrspace(1)* nocapture readonly %k) local_unnamed_addr #0
!kernel_arg_addr_space !5 !kernel_arg_access_qual !6 !kernel_arg_type !7
!kernel_arg_base_type !7 !kernel_arg_type_qual !8 {
entry:
%0 = load i32, i32 addrspace(1)* %k, align 4, !tbaa !9
store i32 %0, i32 addrspace(1)* %out, align 4, !tbaa !9
ret void
}
```
>From 99438e164b8977db5bbb0eed3077bf71290fcefd Mon Sep 17 00:00:00 2001
From: Keshav Vinayak Jha <[email protected]>
Date: Mon, 24 Aug 2026 09:11:24 +0000
Subject: [PATCH] [Clang][OpenCL] Mark constant address space loads invariant
---
clang/lib/CodeGen/CGExpr.cpp | 3 +++
clang/test/CodeGenOpenCL/invariant-load.cl | 24 ++++++++++++++++++++++
2 files changed, 27 insertions(+)
create mode 100644 clang/test/CodeGenOpenCL/invariant-load.cl
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index eff6a7de320d7..ef66b9f0d4af7 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -2248,6 +2248,9 @@ llvm::Value *CodeGenFunction::EmitLoadOfScalar(Address
Addr, bool Volatile,
Addr.withElementType(convertTypeForLoadStore(Ty, Addr.getElementType()));
llvm::LoadInst *Load = Builder.CreateLoad(Addr, Volatile);
+ if (Ty.getAddressSpace() == LangAS::opencl_constant)
+ Load->setMetadata(llvm::LLVMContext::MD_invariant_load,
+ llvm::MDNode::get(Load->getContext(), {}));
if (isNontemporal) {
llvm::MDNode *Node = llvm::MDNode::get(
Load->getContext(),
llvm::ConstantAsMetadata::get(Builder.getInt32(1)));
diff --git a/clang/test/CodeGenOpenCL/invariant-load.cl
b/clang/test/CodeGenOpenCL/invariant-load.cl
new file mode 100644
index 0000000000000..717348398e28e
--- /dev/null
+++ b/clang/test/CodeGenOpenCL/invariant-load.cl
@@ -0,0 +1,24 @@
+// REQUIRES: amdgpu-registered-target
+// RUN: %clang_cc1 -triple amdgcn-amd-amdhsa -cl-std=CL2.0 -O0 -emit-llvm -o -
%s | FileCheck %s --check-prefix=AMDGCN
+// RUN: %clang_cc1 -triple spir64-unknown-unknown -cl-std=CL2.0 -O0 -emit-llvm
-o - %s | FileCheck %s --check-prefix=SPIR
+
+kernel void constant_load(global int *out, constant int *in) {
+ out[0] = in[0];
+}
+
+// AMDGCN-LABEL: define{{.*}}@constant_load(
+// AMDGCN: load i32, ptr addrspace(4) %{{.*}}, align 4, !invariant.load
[[INVARIANT:![0-9]+]]
+// SPIR-LABEL: define{{.*}}@constant_load(
+// SPIR: load i32, ptr addrspace(2) %{{.*}}, align 4, !invariant.load
[[INVARIANT:![0-9]+]]
+
+kernel void global_const_load(global int *out, global const int *in) {
+ out[0] = in[0];
+}
+
+// AMDGCN-LABEL: define{{.*}}@global_const_load(
+// AMDGCN: load i32, ptr addrspace(1) %{{.*}}, align 4{{$}}
+// SPIR-LABEL: define{{.*}}@global_const_load(
+// SPIR: load i32, ptr addrspace(1) %{{.*}}, align 4{{$}}
+
+// AMDGCN: [[INVARIANT]] = !{}
+// SPIR: [[INVARIANT]] = !{}
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits