// RUN: cir-translate %s -cir-to-llvmir --target spirv64-unknown-unknown -o %t.ll // RUN: FileCheck --input-file=%t.ll %s -check-prefix=LLVM !s32i = !cir.int module { cir.global external target_address_space(7) @addrspace3 = #cir.int<3> : !s32i // LLVM: @addrspace3 = addrspace(7) global i32 // Test GlobalViewAttr with address space cast. cir.global external target_address_space(1) @global_in_as1 = #cir.int<42> : !s32i // LLVM: @global_in_as1 = addrspace(1) global i32 42 // Reference to @global_in_as1 with a pointer in default address space (0). // Both the base type (void vs i32) and address space (1 vs 0) differ. cir.global external @ref_with_addrspacecast = #cir.const_array<[#cir.global_view<@global_in_as1> : !cir.ptr]> : !cir.array x 1> // LLVM: @ref_with_addrspacecast = global [1 x ptr] [ptr addrspacecast (ptr addrspace(1) @global_in_as1 to ptr)] // Same base type but different address space. cir.global external target_address_space(1) @counter = #cir.int<42> : !s32i // LLVM: @counter = addrspace(1) global i32 42 cir.global external @slot = #cir.const_array<[#cir.global_view<@counter> : !cir.ptr]> : !cir.array x 1> // LLVM: @slot = global [1 x ptr] [ptr addrspacecast (ptr addrspace(1) @counter to ptr)] // LLVM: define void @foo(ptr %0) cir.func @foo(%arg0: !cir.ptr) { // LLVM-NEXT: alloca ptr, %0 = cir.alloca !cir.ptr, !cir.ptr>, ["arg", init] {alignment = 8 : i64} cir.return } // LLVM: define void @bar(ptr addrspace(1) %0) cir.func @bar(%arg0: !cir.ptr) { // LLVM-NEXT: alloca ptr addrspace(1) %0 = cir.alloca !cir.ptr, !cir.ptr>, ["arg", init] {alignment = 8 : i64} cir.return } // LLVM: define void @baz(ptr %0) cir.func @baz(%arg0: !cir.ptr) { // LLVM-NEXT: alloca ptr, %0 = cir.alloca !cir.ptr, !cir.ptr>, ["arg", init] {alignment = 8 : i64} cir.return } }