From 4b9661965bdbcb5e7019437b8204eadf54ac791d Mon Sep 17 00:00:00 2001 From: Tim Besard Date: Fri, 8 Sep 2017 20:30:04 +0200 Subject: [PATCH] Adapt to new anonymous pointers in Julia. --- src/device/intrinsics/memory_shared.jl | 19 ++++++++++----- src/pointer.jl | 32 +++++++++++++++++++++----- test/codegen.jl | 10 ++++++-- 3 files changed, 47 insertions(+), 14 deletions(-) diff --git a/src/device/intrinsics/memory_shared.jl b/src/device/intrinsics/memory_shared.jl index c0bab9c8..a07016ba 100644 --- a/src/device/intrinsics/memory_shared.jl +++ b/src/device/intrinsics/memory_shared.jl @@ -14,14 +14,21 @@ function emit_shmem(id, llvmtyp, len, align) var = Symbol("@shmem", id) jltyp = jltypes[llvmtyp] + decl = """$var = external addrspace(3) global [$len x $llvmtyp], align $align""" + if VERSION >= v"0.7.0-DEV.1704" + def = """%1 = getelementptr inbounds [$len x $llvmtyp], [$len x $llvmtyp] addrspace(3)* $var, i64 0, i64 0 + %2 = addrspacecast $llvmtyp addrspace(3)* %1 to $llvmtyp addrspace(0)* + %3 = ptrtoint $llvmtyp* %2 to i64 + ret i64 %3""" + else + def = """%1 = getelementptr inbounds [$len x $llvmtyp], [$len x $llvmtyp] addrspace(3)* $var, i64 0, i64 0 + %2 = addrspacecast $llvmtyp addrspace(3)* %1 to $llvmtyp addrspace(0)* + ret $llvmtyp* %2""" + end + @gensym ptr quote - $ptr = Base.llvmcall( - ($"""$var = external addrspace(3) global [$len x $llvmtyp], align $align""", - $"""%1 = getelementptr inbounds [$len x $llvmtyp], [$len x $llvmtyp] addrspace(3)* $var, i64 0, i64 0 - %2 = addrspacecast $llvmtyp addrspace(3)* %1 to $llvmtyp addrspace(0)* - ret $llvmtyp* %2"""), - Ptr{$jltyp}, Tuple{}) + $ptr = Base.llvmcall(($decl, $def), Ptr{$jltyp}, Tuple{}) DevicePtr{$jltyp,AS.Shared}($ptr) end end diff --git a/src/pointer.jl b/src/pointer.jl index 2ce378fc..626062bf 100644 --- a/src/pointer.jl +++ b/src/pointer.jl @@ -105,9 +105,13 @@ if Base.VERSION >= v"0.6.1" ::Type{Val{align}}=Val{1}) where {T,A,align,I<:Integer} eltyp = convert(LLVMType, T) + T_int = convert(LLVMType, Int) + T_ptr = convert(LLVMType, Ptr{T}) + + T_actual_ptr = LLVM.PointerType(eltyp) + # create a function - param_types = [LLVM.PointerType(eltyp), - LLVM.IntType(sizeof(Int)*8, jlctx[])] + param_types = [T_ptr, T_int] llvmf = create_llvmf(eltyp, param_types) # generate IR @@ -115,7 +119,13 @@ if Base.VERSION >= v"0.6.1" entry = BasicBlock(llvmf, "entry", jlctx[]) position!(builder, entry) - ptr = gep!(builder, parameters(llvmf)[1], [parameters(llvmf)[2]]) + if VERSION >= v"0.7.0-DEV.1704" + ptr = inttoptr!(builder, parameters(llvmf)[1], T_actual_ptr) + else + ptr = parameters(llvmf)[1] + end + + ptr = gep!(builder, ptr, [parameters(llvmf)[2]]) ptr_with_as = addrspacecast!(builder, ptr, LLVM.PointerType(eltyp, convert(Int, A))) val = load!(builder, ptr_with_as) alignment!(val, align) @@ -129,9 +139,13 @@ if Base.VERSION >= v"0.6.1" ::Type{Val{align}}=Val{1}) where {T,A,align,I<:Integer} eltyp = convert(LLVMType, T) + T_int = convert(LLVMType, Int) + T_ptr = convert(LLVMType, Ptr{T}) + + T_actual_ptr = LLVM.PointerType(eltyp) + # create a function - param_types = [LLVM.PointerType(eltyp), eltyp, - LLVM.IntType(sizeof(Int)*8, jlctx[])] + param_types = [T_ptr, eltyp, T_int] llvmf = create_llvmf(LLVM.VoidType(jlctx[]), param_types) # generate IR @@ -139,7 +153,13 @@ if Base.VERSION >= v"0.6.1" entry = BasicBlock(llvmf, "entry", jlctx[]) position!(builder, entry) - ptr = gep!(builder, parameters(llvmf)[1], [parameters(llvmf)[3]]) + if VERSION >= v"0.7.0-DEV.1704" + ptr = inttoptr!(builder, parameters(llvmf)[1], T_actual_ptr) + else + ptr = parameters(llvmf)[1] + end + + ptr = gep!(builder, ptr, [parameters(llvmf)[3]]) ptr_with_as = addrspacecast!(builder, ptr, LLVM.PointerType(eltyp, convert(Int, A))) val = parameters(llvmf)[2] inst = store!(builder, val, ptr_with_as) diff --git a/test/codegen.jl b/test/codegen.jl index f7328f40..4216402b 100644 --- a/test/codegen.jl +++ b/test/codegen.jl @@ -73,11 +73,17 @@ end x::Int end + if VERSION >= v"0.7.0-DEV.1704" + typename = "{ i64 }" + else + typename = "%Aggregate(\\.\\d+)?" + end + ir = sprint(io->CUDAnative.code_llvm(io, codegen_aggregates, Tuple{Aggregate})) - @test ismatch(r"@julia_codegen_aggregates_\d+\(%Aggregate", ir) + @test ismatch(Regex("@julia_codegen_aggregates_\\d+\\($typename( addrspace\\(\\d+\\))?\\*"), ir) ir = sprint(io->CUDAnative.code_llvm(io, codegen_aggregates, Tuple{Aggregate}; kernel=true)) - @test ismatch(r"@ptxcall_codegen_aggregates_\d+\(%Aggregate", ir) + @test ismatch(Regex("@ptxcall_codegen_aggregates_\\d+\\($typename\\)"), ir) end end