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

Reply via email to