[llvm] [DirectX] Implement `memcpy` in DXIL CBuffer Access pass (PR #144436)
Finn Plummer via llvm-commits
llvm-commits at lists.llvm.org
Thu Jun 19 16:43:26 PDT 2025
================
@@ -0,0 +1,204 @@
+; RUN: opt -S -dxil-cbuffer-access -mtriple=dxil--shadermodel6.3-library %s | FileCheck %s
+
+; cbuffer CB : register(b0) {
+; float a1[3];
+; double3 a2[2];
+; float16_t a3[2][2];
+; uint64_t a4[3];
+; int2 a5[3][2];
+; uint16_t a6[1];
+; int64_t a7[2];
+; bool a8[4];
+; }
+%__cblayout_CB = type <{ [3 x float], [2 x <3 x double>], [2 x [2 x half]], [3 x i64], [3 x [2 x <2 x i32>]], [1 x i16], [2 x i64], [4 x i32] }>
+
+ at CB.cb = local_unnamed_addr global target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 708, 0, 48, 112, 176, 224, 272, 288, 320)) poison
+ at a1 = external local_unnamed_addr addrspace(2) global [3 x float], align 4
+ at a2 = external local_unnamed_addr addrspace(2) global [2 x <3 x double>], align 32
+ at a3 = external local_unnamed_addr addrspace(2) global [2 x [2 x half]], align 2
+ at a4 = external local_unnamed_addr addrspace(2) global [3 x i64], align 8
+ at a5 = external local_unnamed_addr addrspace(2) global [3 x [2 x <2 x i32>]], align 16
+ at a6 = external local_unnamed_addr addrspace(2) global [1 x i16], align 2
+ at a7 = external local_unnamed_addr addrspace(2) global [2 x i64], align 8
+ at a8 = external local_unnamed_addr addrspace(2) global [4 x i32], align 4
+
+; CHECK: define void @f(
+define void @f(ptr %dst) {
+entry:
+ %CB.cb_h.i.i = tail call target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 708, 0, 48, 112, 176, 224, 272, 288, 320)) @llvm.dx.resource.handlefrombinding(i32 0, i32 0, i32 1, i32 0, i1 false, ptr null)
+ store target("dx.CBuffer", target("dx.Layout", %__cblayout_CB, 708, 0, 48, 112, 176, 224, 272, 288, 320)) %CB.cb_h.i.i, ptr @CB.cb, align 4
+
+ %a1.copy = alloca [3 x float], align 4
+ %a2.copy = alloca [2 x <3 x double>], align 32
+ %a3.copy = alloca [2 x [2 x half]], align 2
+ %a4.copy = alloca [3 x i64], align 8
+ %a5.copy = alloca [3 x [2 x <2 x i32>]], align 16
+ %a6.copy = alloca [1 x i16], align 2
+ %a7.copy = alloca [2 x i64], align 8
+ %a8.copy = alloca [4 x i32], align 4
+
+; CHECK: [[CB:%.*]] = load target("dx.CBuffer", {{.*}})), ptr @CB.cb, align 4
+; CHECK: [[LOAD:%.*]] = call { float, float, float, float } @llvm.dx.resource.load.cbufferrow.4.{{.*}}(target("dx.CBuffer", {{.*}})) [[CB]], i32 0)
+; CHECK: [[X:%.*]] = extractvalue { float, float, float, float } [[LOAD]], 0
+; CHECK: [[DEST:%.*]] = getelementptr inbounds i8, ptr [[A1_COPY:%.*]], i32 0
+; CHECK: store float [[X]], ptr [[DEST]], align 4
+; CHECK: [[LOAD:%.*]] = call { float, float, float, float } @llvm.dx.resource.load.cbufferrow.4.{{.*}}(target("dx.CBuffer", {{.*}})) [[CB]], i32 1)
+; CHECK: [[Y:%.*]] = extractvalue { float, float, float, float } [[LOAD]], 0
+; CHECK: [[DEST:%.*]] = getelementptr inbounds i8, ptr [[A1_COPY]], i32 4
+; CHECK: store float [[Y]], ptr [[DEST]], align 4
+; CHECK: [[LOAD:%.*]] = call { float, float, float, float } @llvm.dx.resource.load.cbufferrow.4.{{.*}}(target("dx.CBuffer", {{.*}})) [[CB]], i32 2)
+; CHECK: [[Z:%.*]] = extractvalue { float, float, float, float } [[LOAD]], 0
+; CHECK: [[DEST:%.*]] = getelementptr inbounds i8, ptr [[A1_COPY]], i32 8
+; CHECK: store float [[Z]], ptr [[DEST]], align 4
----------------
inbelic wrote:
Thinking out loud, we seem to extract the first 2 elements from the below `LOAD` maybe the dimensions are mixed up?
https://github.com/llvm/llvm-project/pull/144436
More information about the llvm-commits
mailing list