14f63f973SMatt Arsenault; RUN: opt -S -mtriple=amdgcn-- -passes=amdgpu-lower-ctor-dtor < %s | FileCheck %s 24f63f973SMatt Arsenault; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx700 -filetype=obj -o - < %s | llvm-readelf -s - 2>&1 | FileCheck %s -check-prefix=CHECK-VIS 34f63f973SMatt Arsenault 4*8b132747SJoseph Huber; Make sure that we don't modify the functions if amdgcn.device.init or 5*8b132747SJoseph Huber; amdgcn.device.fini already exit. 64f63f973SMatt Arsenault 74f63f973SMatt Arsenault@llvm.global_ctors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @foo, ptr null }] 84f63f973SMatt Arsenault@llvm.global_dtors = appending addrspace(1) global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 1, ptr @bar, ptr null }] 94f63f973SMatt Arsenault 10a1da7461SJoseph Huber; CHECK-LABEL: amdgpu_kernel void @amdgcn.device.init() #0 { 11a1da7461SJoseph Huber; CHECK-NEXT: store volatile i32 1, ptr addrspace(1) null 124f63f973SMatt Arsenault; CHECK-NEXT: ret void 13a1da7461SJoseph Huber; CHECK-NEXT: } 144f63f973SMatt Arsenault 15a1da7461SJoseph Huber; CHECK-LABEL: define amdgpu_kernel void @amdgcn.device.fini() #1 { 16a1da7461SJoseph Huber; CHECK-NEXT: store volatile i32 0, ptr addrspace(1) null 174f63f973SMatt Arsenault; CHECK-NEXT: ret void 18a1da7461SJoseph Huber; CHECK-NEXT: } 194f63f973SMatt Arsenault 204f63f973SMatt Arsenault; CHECK-NOT: amdgcn.device. 214f63f973SMatt Arsenault 224f63f973SMatt Arsenault; CHECK-VIS: FUNC GLOBAL PROTECTED {{.*}} amdgcn.device.init{{$}} 234f63f973SMatt Arsenault; CHECK-VIS: OBJECT GLOBAL DEFAULT {{.*}} amdgcn.device.init.kd{{$}} 244f63f973SMatt Arsenault; CHECK-VIS: FUNC GLOBAL PROTECTED {{.*}} amdgcn.device.fini{{$}} 254f63f973SMatt Arsenault; CHECK-VIS: OBJECT GLOBAL DEFAULT {{.*}} amdgcn.device.fini.kd{{$}} 264f63f973SMatt Arsenault 274f63f973SMatt Arsenaultdefine internal void @foo() { 284f63f973SMatt Arsenault ret void 294f63f973SMatt Arsenault} 304f63f973SMatt Arsenault 314f63f973SMatt Arsenaultdefine internal void @bar() { 324f63f973SMatt Arsenault ret void 334f63f973SMatt Arsenault} 344f63f973SMatt Arsenault 354f63f973SMatt Arsenaultdefine amdgpu_kernel void @amdgcn.device.init() #0 { 364f63f973SMatt Arsenault store volatile i32 1, ptr addrspace(1) null 374f63f973SMatt Arsenault ret void 384f63f973SMatt Arsenault} 394f63f973SMatt Arsenault 404f63f973SMatt Arsenaultdefine amdgpu_kernel void @amdgcn.device.fini() #1 { 414f63f973SMatt Arsenault store volatile i32 0, ptr addrspace(1) null 424f63f973SMatt Arsenault ret void 434f63f973SMatt Arsenault} 444f63f973SMatt Arsenault 454f63f973SMatt Arsenaultattributes #0 = { "device-init" } 464f63f973SMatt Arsenaultattributes #1 = { "device-fini" } 474f63f973SMatt Arsenault; CHECK: attributes #0 = { "device-init" } 484f63f973SMatt Arsenault; CHECK: attributes #1 = { "device-fini" } 49