108 lines · plain
1; RUN: opt < %s -S -passes=infer-address-spaces | FileCheck %s --check-prefix=INFER
2; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_90 -mattr=+ptx80 | FileCheck %s --check-prefix=PTX
3; RUN: %if ptxas-sm_90 && ptxas-isa-8.0 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_90 -mattr=+ptx80 | %ptxas-verify -arch=sm_90 %}
4
5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v16:16:16-v32:32:32-v64:64:64-v128:128:128-n16:32:64"
6target triple = "nvptx64-unknown-unknown"
7
8@constant_tensormap = addrspace(4) global [64 x i8] zeroinitializer, align 64
9
10; Inference from const address space
11define void @test_infer_const_from_cast() {
12; INFER-LABEL: @test_infer_const_from_cast
13; INFER: call void @llvm.nvvm.prefetch.tensormap.p4(ptr addrspace(4) @constant_tensormap)
14; PTX-LABEL: .visible .func test_infer_const_from_cast(
15; PTX: mov.b64 %rd{{[0-9]+}}, constant_tensormap;
16; PTX: cvta.const.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}};
17; PTX: prefetch.tensormap [%rd{{[0-9]+}}];
18entry:
19 %casted = addrspacecast ptr addrspace(4) @constant_tensormap to ptr
20 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %casted)
21 ret void
22}
23
24; Cast from Const space to Generic
25define void @test_const_to_generic_cast(ptr addrspace(4) %const_ptr) {
26; INFER-LABEL: @test_const_to_generic_cast
27; INFER: call void @llvm.nvvm.prefetch.tensormap.p4(ptr addrspace(4) %const_ptr)
28; PTX-LABEL: .visible .func test_const_to_generic_cast(
29; PTX: prefetch.const.tensormap [%rd{{[0-9]+}}];
30entry:
31 %cast = addrspacecast ptr addrspace(4) %const_ptr to ptr
32 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %cast)
33 ret void
34}
35
36; No inference possible
37define void @test_no_inference_possible(ptr %generic_ptr) {
38; INFER-LABEL: @test_no_inference_possible
39; INFER: call void @llvm.nvvm.prefetch.tensormap.p0(ptr %generic_ptr)
40; PTX-LABEL: .visible .func test_no_inference_possible(
41; PTX: prefetch.tensormap [%rd{{[0-9]+}}];
42entry:
43 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %generic_ptr)
44 ret void
45}
46
47; Cast from Parameter space to Generic
48define void @test_param_to_generic_cast(ptr addrspace(101) %param_ptr) {
49; INFER-LABEL: @test_param_to_generic_cast
50; INFER: call void @llvm.nvvm.prefetch.tensormap.p101(ptr addrspace(101) %param_ptr)
51; PTX-LABEL: .visible .func test_param_to_generic_cast(
52; PTX: prefetch.param.tensormap [%rd{{[0-9]+}}];
53entry:
54 %cast = addrspacecast ptr addrspace(101) %param_ptr to ptr
55 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %cast)
56 ret void
57}
58
59; Multiple casts in sequence
60define void @test_infer_through_multiple_casts() {
61; INFER-LABEL: @test_infer_through_multiple_casts
62; INFER: call void @llvm.nvvm.prefetch.tensormap.p4(ptr addrspace(4) @constant_tensormap)
63; PTX-LABEL: .visible .func test_infer_through_multiple_casts(
64; PTX: mov.b64 %rd{{[0-9]+}}, constant_tensormap;
65; PTX: cvta.const.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}};
66; PTX: prefetch.tensormap [%rd{{[0-9]+}}];
67entry:
68 %cast1 = addrspacecast ptr addrspace(4) @constant_tensormap to ptr
69 %cast2 = addrspacecast ptr %cast1 to ptr addrspace(4)
70 %cast3 = addrspacecast ptr addrspace(4) %cast2 to ptr
71 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %cast3)
72 ret void
73}
74
75; Kernel Function Test
76; Cast from Param space to Generic
77define ptx_kernel void @test_param_to_generic_cast_kernel(ptr addrspace(101) %param_ptr) {
78; INFER-LABEL: @test_param_to_generic_cast_kernel
79; INFER: call void @llvm.nvvm.prefetch.tensormap.p101(ptr addrspace(101) %param_ptr)
80; PTX-LABEL: .visible .entry test_param_to_generic_cast_kernel(
81; PTX: prefetch.param.tensormap [%rd{{[0-9]+}}];
82entry:
83 %cast = addrspacecast ptr addrspace(101) %param_ptr to ptr
84 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %cast)
85 ret void
86}
87
88; Kernel Function Test
89; Multiple casts in sequence
90define ptx_kernel void @test_infer_through_multiple_casts_kernel() {
91; INFER-LABEL: @test_infer_through_multiple_casts_kernel
92; INFER: call void @llvm.nvvm.prefetch.tensormap.p4(ptr addrspace(4) @constant_tensormap)
93; PTX-LABEL: .visible .entry test_infer_through_multiple_casts_kernel(
94; PTX: mov.b64 %rd{{[0-9]+}}, constant_tensormap;
95; PTX: cvta.const.u64 %rd{{[0-9]+}}, %rd{{[0-9]+}};
96; PTX: prefetch.tensormap [%rd{{[0-9]+}}];
97entry:
98 %cast1 = addrspacecast ptr addrspace(4) @constant_tensormap to ptr
99 %cast2 = addrspacecast ptr %cast1 to ptr addrspace(4)
100 %cast3 = addrspacecast ptr addrspace(4) %cast2 to ptr
101 call void @llvm.nvvm.prefetch.tensormap.p0(ptr %cast3)
102 ret void
103}
104
105declare void @llvm.nvvm.prefetch.tensormap.p0(ptr)
106declare void @llvm.nvvm.prefetch.tensormap.p4(ptr addrspace(4))
107declare void @llvm.nvvm.prefetch.tensormap.p101(ptr addrspace(101))
108