Skip to content

Commit f1e1c63

Browse files
EbinJose2002mahesh-attarde
authored andcommitted
[SPIRV] Test file for memmove intrinsic (llvm#152640)
- Added test for checking the lowering of memmove to OpCopyMemorySized - Modified NoSignedUnsignedWrap.ll by adding a RUN line
1 parent f3f99b6 commit f1e1c63

File tree

2 files changed

+88
-1
lines changed

2 files changed

+88
-1
lines changed
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK-SPIRV-NOT: llvm.memmove
5+
6+
; CHECK-DAG: %[[#Int8:]] = OpTypeInt 8 0
7+
; CHECK-DAG: %[[#Int32:]] = OpTypeInt 32 0
8+
; CHECK-DAG: %[[#Int64:]] = OpTypeInt 64 0
9+
; CHECK-DAG: %[[#Ptr_CrossWG_8:]] = OpTypePointer CrossWorkgroup %[[#Int8]]
10+
; CHECK-DAG: %[[#Ptr_Generic_32:]] = OpTypePointer Generic %[[#Int32]]
11+
; CHECK-DAG: %[[#Const_64:]] = OpConstant %[[#Int32]] 64
12+
; CHECK-DAG: %[[#Const_36:]] = OpConstant %[[#Int32]] 36
13+
; CHECK-DAG: %[[#Const_30:]] = OpConstant %[[#Int32]] 30
14+
; CHECK-DAG: %[[#Const_32_64:]] = OpConstant %[[#Int64]] 32
15+
16+
; CHECK: %[[#Param1:]] = OpFunctionParameter %[[#Ptr_CrossWG_8]]
17+
; CHECK: %[[#Param2:]] = OpFunctionParameter %[[#Ptr_CrossWG_8]]
18+
; CHECK: %[[#Size1:]] = OpUConvert %[[#Int64]] %[[#Const_64]]
19+
; CHECK: OpCopyMemorySized %[[#Param2]] %[[#Param1]] %[[#Size1]] Aligned 64
20+
21+
; CHECK: %[[#Src:]] = OpFunctionParameter %[[#Ptr_CrossWG_8]]
22+
; CHECK: %[[#CastDst2:]] = OpGenericCastToPtr %[[#Ptr_CrossWG_8]] %[[#GenPtr:]]
23+
; CHECK: %[[#Size2:]] = OpUConvert %[[#Int64]] %[[#Const_36]]
24+
; CHECK: OpCopyMemorySized %[[#CastDst2]] %[[#Src]] %[[#Size2]] Aligned 64
25+
26+
; CHECK: %[[#Param1:]] = OpFunctionParameter %[[#Ptr_CrossWG_8]]
27+
; CHECK: %[[#Param2:]] = OpFunctionParameter %[[#Ptr_CrossWG_8]]
28+
; CHECK: %[[#Size3:]] = OpUConvert %[[#Int64]] %[[#Const_30]]
29+
; CHECK: OpCopyMemorySized %[[#Param2]] %[[#Param1]] %[[#Size3]] Aligned 1
30+
31+
; CHECK: %[[#Phi:]] = OpPhi %[[#Ptr_Generic_32]] %[[#Op1:]] %[[#Lbl1:]] %[[#Op2:]] %[[#Lbl2:]]
32+
; CHECK: %[[#Cast:]] = OpPtrCastToGeneric %[[#]] %[[#]]
33+
; CHECK: OpCopyMemorySized %[[#Cast]] %[[#Phi]] %[[#Const_32_64]] Aligned 8
34+
35+
%struct.SomeStruct = type { <16 x float>, i32, [60 x i8] }
36+
%class.kfunc = type <{ i32, i32, i32, [4 x i8] }>
37+
38+
@InvocIndex = external local_unnamed_addr addrspace(1) constant i64, align 8
39+
@"func_object1" = internal addrspace(3) global %class.kfunc zeroinitializer, align 8
40+
41+
define spir_kernel void @test_full_move(%struct.SomeStruct addrspace(1)* captures(none) readonly %in, %struct.SomeStruct addrspace(1)* captures(none) %out) {
42+
%1 = bitcast %struct.SomeStruct addrspace(1)* %in to i8 addrspace(1)*
43+
%2 = bitcast %struct.SomeStruct addrspace(1)* %out to i8 addrspace(1)*
44+
call void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* align 64 %2, i8 addrspace(1)* align 64 %1, i32 64, i1 false)
45+
ret void
46+
}
47+
48+
define spir_kernel void @test_partial_move(%struct.SomeStruct addrspace(1)* captures(none) readonly %in, %struct.SomeStruct addrspace(4)* captures(none) %out) {
49+
%1 = bitcast %struct.SomeStruct addrspace(1)* %in to i8 addrspace(1)*
50+
%2 = bitcast %struct.SomeStruct addrspace(4)* %out to i8 addrspace(4)*
51+
%3 = addrspacecast i8 addrspace(4)* %2 to i8 addrspace(1)*
52+
call void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* align 64 %3, i8 addrspace(1)* align 64 %1, i32 36, i1 false)
53+
ret void
54+
}
55+
56+
define spir_kernel void @test_array(i8 addrspace(1)* %in, i8 addrspace(1)* %out) {
57+
call void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* %out, i8 addrspace(1)* %in, i32 30, i1 false)
58+
ret void
59+
}
60+
61+
define weak_odr dso_local spir_kernel void @test_phi() local_unnamed_addr {
62+
entry:
63+
%0 = alloca i32, align 8
64+
%1 = addrspacecast i32* %0 to i32 addrspace(4)*
65+
%2 = load i64, i64 addrspace(1)* @InvocIndex, align 8
66+
%cmp = icmp eq i64 %2, 0
67+
br i1 %cmp, label %leader, label %entry.merge_crit_edge
68+
69+
entry.merge_crit_edge: ; preds = %entry
70+
%3 = bitcast i32 addrspace(4)* %1 to i8 addrspace(4)*
71+
br label %merge
72+
73+
leader: ; preds = %entry
74+
%4 = bitcast i32 addrspace(4)* %1 to i8 addrspace(4)*
75+
br label %merge
76+
77+
merge: ; preds = %entry.merge_crit_edge, %leader
78+
%phi = phi i8 addrspace(4)* [ %3, %entry.merge_crit_edge ], [ %4, %leader ]
79+
%5 = addrspacecast i8 addrspace(3)* bitcast (%class.kfunc addrspace(3)* @"func_object1" to i8 addrspace(3)*) to i8 addrspace(4)*
80+
call void @llvm.memmove.p4i8.p4i8.i64(i8 addrspace(4)* align 8 dereferenceable(32) %5, i8 addrspace(4)* align 8 dereferenceable(32) %phi, i64 32, i1 false)
81+
ret void
82+
}
83+
84+
declare void @llvm.memmove.p4i8.p4i8.i64(i8 addrspace(4)* captures(none) writeonly, i8 addrspace(4)* captures(none) readonly, i64, i1 immarg)
85+
86+
declare void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* captures(none), i8 addrspace(1)* captures(none) readonly, i32, i1)

llvm/test/CodeGen/SPIRV/transcoding/NoSignedUnsignedWrap.ll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,11 @@
77
;;
88
;; Positive tests:
99
;;
10-
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_KHR_no_integer_wrap_decoration %s -o - | FileCheck %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-NEGATIVE
10+
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown --spirv-ext=+SPV_KHR_no_integer_wrap_decoration %s -o - | FileCheck %s --check-prefixes=CHECK-SPIRV
1111
;;
1212
;; Negative tests:
1313
;;
14+
; RUN: llc -O0 -mtriple=spirv32-unknown-unknown %s -o - | FileCheck %s --check-prefixes=CHECK-SPIRV-NEGATIVE
1415
;; Check that backend is able to skip nsw/nuw attributes if extension is
1516
;; disabled implicitly or explicitly and if max SPIR-V version is lower then 1.4
1617

0 commit comments

Comments
 (0)