|
| 1 | +; RUN: llc -verify-machineinstrs -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s |
| 2 | + |
| 3 | +; CHECK-NOT: llvm.memmove |
| 4 | + |
| 5 | +; CHECK-DAG: %[[#TYPEINT:]] = OpTypeInt 32 0 |
| 6 | +; CHECK-DAG: %[[#I8:]] = OpTypeInt 8 0 |
| 7 | +; CHECK-DAG: %[[#I64:]] = OpTypeInt 64 0 |
| 8 | +; CHECK-DAG: %[[#C128:]] = OpConstant %[[#TYPEINT]] 128 |
| 9 | +; CHECK-DAG: %[[#C68:]] = OpConstant %[[#TYPEINT]] 68 |
| 10 | +; CHECK-DAG: %[[#C72:]] = OpConstant %[[#TYPEINT]] 72 |
| 11 | +; CHECK-DAG: %[[#C32:]] = OpConstant %[[#I64]] 32 |
| 12 | +; CHECK-DAG: %[[#I8CrossWG_PTR:]] = OpTypePointer CrossWorkgroup %[[#I8]] |
| 13 | +; CHECK-DAG: %[[#I8Generic_PTR:]] = OpTypePointer Generic %[[#I8]] |
| 14 | + |
| 15 | +; CHECK: %[[#]] = OpFunction |
| 16 | +; CHECK: %[[#ARG_IN1:]] = OpFunctionParameter %[[#I8CrossWG_PTR]] |
| 17 | +; CHECK: %[[#ARG_OUT1:]] = OpFunctionParameter %[[#I8CrossWG_PTR]] |
| 18 | +; CHECK: %[[#CONVERT1:]] = OpUConvert %[[#I64]] %[[#C128]] |
| 19 | +; CHECK: OpCopyMemorySized %[[#ARG_OUT1]] %[[#ARG_IN1]] %[[#CONVERT1]] Aligned 64 |
| 20 | + |
| 21 | +; CHECK: %[[#]] = OpFunction |
| 22 | +; CHECK: %[[#ARG_IN2:]] = OpFunctionParameter %[[#I8CrossWG_PTR]] |
| 23 | +; CHECK: %[[#FP:]] = OpFunctionParameter %[[#I8Generic_PTR]] |
| 24 | +; CHECK: %[[#ARG_OUT2:]] = OpGenericCastToPtr %[[#I8CrossWG_PTR]] %[[#FP:]] |
| 25 | +; CHECK: %[[#CONVERT2:]] = OpUConvert %[[#I64]] %[[#C68]] |
| 26 | +; CHECK: CopyMemorySized %[[#ARG_OUT2]] %[[#ARG_IN2]] %[[#CONVERT2]] Aligned 64 |
| 27 | + |
| 28 | +; CHECK: %[[#]] = OpFunction |
| 29 | +; CHECK: %[[#ARG_IN3:]] = OpFunctionParameter %[[#I8CrossWG_PTR]] |
| 30 | +; CHECK: %[[#ARG_OUT3:]] = OpFunctionParameter %[[#I8CrossWG_PTR]] |
| 31 | +; CHECK: %[[#CONVERT3:]] = OpUConvert %[[#I64]] %[[#C72]] |
| 32 | +; CHECK: OpCopyMemorySized %[[#ARG_OUT3]] %[[#ARG_IN3]] %[[#CONVERT3]] Aligned 1 |
| 33 | + |
| 34 | +; CHECK: %[[#]] = OpFunction |
| 35 | +; CHECK: %[[#PHI:]] = OpPhi %[[#]] %[[#]] %[[#]] %[[#]] %[[#]] |
| 36 | +; CHECK: %[[#CASTTOGENERIC:]] = OpPtrCastToGeneric %[[#]] %[[#]] |
| 37 | +; CHECK: OpCopyMemorySized %[[#CASTTOGENERIC]] %[[#PHI]] %[[#C32]] Aligned 8 |
| 38 | + |
| 39 | +target datalayout = "e-p:32:32-i64:64-v16:16-v24:32-v32:32-v48:64-v96:128-v192:256-v256:256-v512:512-v1024:1024-n8:16:32:64" |
| 40 | +target triple = "spir-unknown-unknown" |
| 41 | + |
| 42 | +%struct.SomeStruct = type { <16 x float>, i32, [60 x i8] } |
| 43 | +%class.kfunc = type <{ i32, i32, i32, [4 x i8] }> |
| 44 | + |
| 45 | +@InvocIndex = external local_unnamed_addr addrspace(1) constant i64, align 8 |
| 46 | +@"func_object1" = internal addrspace(3) global %class.kfunc zeroinitializer, align 8 |
| 47 | + |
| 48 | +; Function Attrs: nounwind |
| 49 | +define spir_kernel void @test_full_move(%struct.SomeStruct addrspace(1)* captures(none) readonly %in, %struct.SomeStruct addrspace(1)* captures(none) %out) #0 !kernel_arg_addr_space !1 !kernel_arg_access_qual !2 !kernel_arg_type !3 !kernel_arg_base_type !4 !kernel_arg_type_qual !5 { |
| 50 | + %1 = bitcast %struct.SomeStruct addrspace(1)* %in to i8 addrspace(1)* |
| 51 | + %2 = bitcast %struct.SomeStruct addrspace(1)* %out to i8 addrspace(1)* |
| 52 | + call void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* align 64 %2, i8 addrspace(1)* align 64 %1, i32 128, i1 false) |
| 53 | + ret void |
| 54 | +} |
| 55 | + |
| 56 | +define spir_kernel void @test_partial_move(%struct.SomeStruct addrspace(1)* captures(none) readonly %in, %struct.SomeStruct addrspace(4)* captures(none) %out) { |
| 57 | + %1 = bitcast %struct.SomeStruct addrspace(1)* %in to i8 addrspace(1)* |
| 58 | + %2 = bitcast %struct.SomeStruct addrspace(4)* %out to i8 addrspace(4)* |
| 59 | + %3 = addrspacecast i8 addrspace(4)* %2 to i8 addrspace(1)* |
| 60 | + call void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* align 64 %3, i8 addrspace(1)* align 64 %1, i32 68, i1 false) |
| 61 | + ret void |
| 62 | +} |
| 63 | + |
| 64 | +; Function Attrs: nounwind |
| 65 | +define spir_kernel void @test_array(i8 addrspace(1)* %in, i8 addrspace(1)* %out) { |
| 66 | + call void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* %out, i8 addrspace(1)* %in, i32 72, i1 false) |
| 67 | + ret void |
| 68 | +} |
| 69 | + |
| 70 | +; Function Attrs: convergent norecurse |
| 71 | +define weak_odr dso_local spir_kernel void @test_phi() local_unnamed_addr { |
| 72 | +entry: |
| 73 | + %0 = alloca i32, align 8 |
| 74 | + %1 = addrspacecast i32* %0 to i32 addrspace(4)* |
| 75 | + %2 = load i64, i64 addrspace(1)* @InvocIndex, align 8 |
| 76 | + %cmp = icmp eq i64 %2, 0 |
| 77 | + br i1 %cmp, label %leader, label %entry.merge_crit_edge |
| 78 | + |
| 79 | +entry.merge_crit_edge: ; preds = %entry |
| 80 | + %3 = bitcast i32 addrspace(4)* %1 to i8 addrspace(4)* |
| 81 | + br label %merge |
| 82 | + |
| 83 | +leader: ; preds = %entry |
| 84 | + %4 = bitcast i32 addrspace(4)* %1 to i8 addrspace(4)* |
| 85 | + br label %merge |
| 86 | + |
| 87 | +merge: ; preds = %entry.merge_crit_edge, %leader |
| 88 | + %phi = phi i8 addrspace(4)* [ %3, %entry.merge_crit_edge ], [ %4, %leader ] |
| 89 | + %5 = addrspacecast i8 addrspace(3)* bitcast (%class.kfunc addrspace(3)* @"func_object1" to i8 addrspace(3)*) to i8 addrspace(4)* |
| 90 | + 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) |
| 91 | + ret void |
| 92 | +} |
| 93 | + |
| 94 | +; Function Attrs: argmemonly nofree nosync nounwind willreturn |
| 95 | +declare void @llvm.memmove.p4i8.p4i8.i64(i8 addrspace(4)* captures(none) writeonly, i8 addrspace(4)* captures(none) readonly, i64, i1 immarg) |
| 96 | + |
| 97 | +; Function Attrs: nounwind |
| 98 | +declare void @llvm.memmove.p1i8.p1i8.i32(i8 addrspace(1)* captures(none), i8 addrspace(1)* captures(none) readonly, i32, i1) #1 |
| 99 | + |
| 100 | +attributes #0 = { nounwind "less-precise-fpmad"="false" "no-frame-pointer-elim"="false" "no_infs-fp-math"="false" "no-nans-fp-math"="false" "no-realign-stack" "stack-protector-buffer-size"="8" "unsafe-fp-math"="false" "use-soft-float"="false" } |
| 101 | +attributes #1 = { nounwind } |
| 102 | + |
| 103 | +!opencl.enable.FP_CONTRACT = !{} |
| 104 | +!opencl.spir.version = !{!7} |
| 105 | +!opencl.ocl.version = !{!7} |
| 106 | +!opencl.used.extensions = !{!8} |
| 107 | +!opencl.used.optional.core.features = !{!8} |
| 108 | +!opencl.compiler.options = !{!8} |
| 109 | + |
| 110 | +!1 = !{i32 1, i32 1} |
| 111 | +!2 = !{!"none", !"none"} |
| 112 | +!3 = !{!"struct SomeStruct*", !"struct SomeStruct*"} |
| 113 | +!4 = !{!"struct SomeStruct*", !"struct SomeStruct*"} |
| 114 | +!5 = !{!"const", !""} |
| 115 | +!7 = !{i32 1, i32 2} |
| 116 | +!8 = !{} |
0 commit comments