| ; RUN: llc < %s -mtriple=nvptx64 -mcpu=sm_30 -mattr=+ptx40 | FileCheck %s | |
| ; RUN: %if ptxas-isa-4.0 %{ llc < %s -mtriple=nvptx64 -mcpu=sm_30 -mattr=+ptx40 | %ptxas-verify %} | |
| ; RUN: not --crash llc < %s -mtriple=nvptx64 -mcpu=sm_20 2>&1 | FileCheck %s --check-prefix ERROR | |
| ; ERROR: LLVM ERROR: .attribute(.managed) requires PTX version >= 4.0 and sm_30 | |
| ; CHECK: .visible .global .align 4 .u32 device_g; | |
| @device_g = addrspace(1) global i32 zeroinitializer | |
| ; CHECK: .visible .global .attribute(.managed) .align 4 .u32 managed_g; | |
| @managed_g = addrspace(1) global i32 zeroinitializer | |
| ; CHECK: .extern .global .align 4 .u32 decl_g; | |
| @decl_g = external addrspace(1) global i32, align 4 | |
| ; CHECK: .extern .global .attribute(.managed) .align 8 .u64 managed_decl_g; | |
| @managed_decl_g = external addrspace(1) global ptr, align 8 | |
| ; A cyclic managed definition needs an exactly matching managed declaration. | |
| ; CHECK: .extern .global .attribute(.managed) .align 8 .u64 managed_self; | |
| ; CHECK-NEXT: .visible .global .attribute(.managed) .align 8 .u64 managed_self = managed_self; | |
| @managed_self = addrspace(1) global ptr addrspace(1) @managed_self, align 8 | |
| !nvvm.annotations = !{!0, !1, !2} | |
| !0 = !{ptr addrspace(1) @managed_g, !"managed", i32 1} | |
| !1 = !{ptr addrspace(1) @managed_decl_g, !"managed", i32 1} | |
| !2 = !{ptr addrspace(1) @managed_self, !"managed", i32 1} |