llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang-codegen
Author: Keshav Vinayak Jha (keshavvinayak01)
<details>
<summary>Changes</summary>
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, constant 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
}
```
---
Full diff: https://github.com/llvm/llvm-project/pull/218356.diff
2 Files Affected:
- (modified) clang/lib/CodeGen/CGExpr.cpp (+3)
- (added) clang/test/CodeGenOpenCL/invariant-load.cl (+24)
``````````diff
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]] = !{}
``````````
</details>
https://github.com/llvm/llvm-project/pull/218356
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits