1; RUN: llc -O0 < %s -march=nvptx -mcpu=sm_20 | FileCheck %s -check-prefixes=ALL,CLS32,G32
2; RUN: llc -O0 < %s -march=nvptx64 -mcpu=sm_20 | FileCheck %s -check-prefixes=ALL,NOPTRCONV,CLS64,G64
3; RUN: llc -O0 < %s -march=nvptx64 -mcpu=sm_20 --nvptx-short-ptr| FileCheck %s -check-prefixes=ALL,PTRCONV,CLS64,G64
4
5; ALL-LABEL: conv1
6define i32 @conv1(i32 addrspace(1)* %ptr) {
7; G32: cvta.global.u32
8; ALL-NOT: cvt.u64.u32
9; G64: cvta.global.u64
10; ALL: ld.u32
11  %genptr = addrspacecast i32 addrspace(1)* %ptr to i32*
12  %val = load i32, i32* %genptr
13  ret i32 %val
14}
15
16; ALL-LABEL: conv2
17define i32 @conv2(i32 addrspace(3)* %ptr) {
18; CLS32: cvta.shared.u32
19; PTRCONV: cvt.u64.u32
20; NOPTRCONV-NOT: cvt.u64.u32
21; CLS64: cvta.shared.u64
22; ALL: ld.u32
23  %genptr = addrspacecast i32 addrspace(3)* %ptr to i32*
24  %val = load i32, i32* %genptr
25  ret i32 %val
26}
27
28; ALL-LABEL: conv3
29define i32 @conv3(i32 addrspace(4)* %ptr) {
30; CLS32: cvta.const.u32
31; PTRCONV: cvt.u64.u32
32; NOPTRCONV-NOT: cvt.u64.u32
33; CLS64: cvta.const.u64
34; ALL: ld.u32
35  %genptr = addrspacecast i32 addrspace(4)* %ptr to i32*
36  %val = load i32, i32* %genptr
37  ret i32 %val
38}
39
40; ALL-LABEL: conv4
41define i32 @conv4(i32 addrspace(5)* %ptr) {
42; CLS32: cvta.local.u32
43; PTRCONV: cvt.u64.u32
44; NOPTRCONV-NOT: cvt.u64.u32
45; CLS64: cvta.local.u64
46; ALL: ld.u32
47  %genptr = addrspacecast i32 addrspace(5)* %ptr to i32*
48  %val = load i32, i32* %genptr
49  ret i32 %val
50}
51
52; ALL-LABEL: conv5
53define i32 @conv5(i32* %ptr) {
54; CLS32: cvta.to.global.u32
55; ALL-NOT: cvt.u64.u32
56; CLS64: cvta.to.global.u64
57; ALL: ld.global.u32
58  %specptr = addrspacecast i32* %ptr to i32 addrspace(1)*
59  %val = load i32, i32 addrspace(1)* %specptr
60  ret i32 %val
61}
62
63; ALL-LABEL: conv6
64define i32 @conv6(i32* %ptr) {
65; CLS32: cvta.to.shared.u32
66; CLS64: cvta.to.shared.u64
67; PTRCONV: cvt.u32.u64
68; NOPTRCONV-NOT: cvt.u32.u64
69; ALL: ld.shared.u32
70  %specptr = addrspacecast i32* %ptr to i32 addrspace(3)*
71  %val = load i32, i32 addrspace(3)* %specptr
72  ret i32 %val
73}
74
75; ALL-LABEL: conv7
76define i32 @conv7(i32* %ptr) {
77; CLS32: cvta.to.const.u32
78; CLS64: cvta.to.const.u64
79; PTRCONV: cvt.u32.u64
80; NOPTRCONV-NOT: cvt.u32.u64
81; ALL: ld.const.u32
82  %specptr = addrspacecast i32* %ptr to i32 addrspace(4)*
83  %val = load i32, i32 addrspace(4)* %specptr
84  ret i32 %val
85}
86
87; ALL-LABEL: conv8
88define i32 @conv8(i32* %ptr) {
89; CLS32: cvta.to.local.u32
90; CLS64: cvta.to.local.u64
91; PTRCONV: cvt.u32.u64
92; NOPTRCONV-NOT: cvt.u32.u64
93; ALL: ld.local.u32
94  %specptr = addrspacecast i32* %ptr to i32 addrspace(5)*
95  %val = load i32, i32 addrspace(5)* %specptr
96  ret i32 %val
97}
98