Skip to content

Commit

Permalink
Rely on LLVM.jl's typed_ccall for more intrinsics. (#1728)
Browse files Browse the repository at this point in the history
  • Loading branch information
maleadt committed Jan 17, 2023
1 parent d595a3e commit 66fa617
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 62 deletions.
4 changes: 3 additions & 1 deletion Manifest.toml
Original file line number Diff line number Diff line change
Expand Up @@ -134,7 +134,9 @@ version = "1.4.1"

[[LLVM]]
deps = ["CEnum", "LLVMExtra_jll", "Libdl", "Printf", "Unicode"]
git-tree-sha1 = "088dd02b2797f0233d92583562ab669de8517fd1"
git-tree-sha1 = "d5ac7912080804fd074712a5387f483c43ec56c7"
repo-rev = "tb/typed_ccall_bool"
repo-url = "https://github.com/maleadt/LLVM.jl.git"
uuid = "929cbde3-209d-540e-8aea-75f648917ca0"
version = "4.14.1"

Expand Down
68 changes: 8 additions & 60 deletions src/device/intrinsics/warp_vote.jl
Original file line number Diff line number Diff line change
Expand Up @@ -6,41 +6,13 @@ for mode in (:all, :any, :uni)
@eval export $fname, $fname_sync

intrinsic = "llvm.nvvm.vote.$mode"
@eval begin
# FIXME: ccall($intrinsic, llvmcall, $rettyp, (Bool,), pred)
# doesn't use i1 for Bool
@inline $fname(pred) =
Base.llvmcall($("""
declare i1 @$intrinsic(i1)
define i8 @entry(i8) #0 {
%predicate = icmp eq i8 %0, 1
%llvmbool = call i1 @$intrinsic(i1 %predicate)
%jlbool = zext i1 %llvmbool to i8
ret i8 %jlbool
}
attributes #0 = { alwaysinline }""", "entry"),
Bool, Tuple{Bool}, pred)
end
@eval @inline $fname(pred) =
@typed_ccall($intrinsic, llvmcall, Bool, (Bool,), pred)

# warp-synchronous
intrinsic = "llvm.nvvm.vote.$mode.sync"
@eval begin
@inline $fname_sync(mask, pred) =
Base.llvmcall($("""
declare i1 @$intrinsic(i32, i1)
define i8 @entry(i32 %mask, i8) #0 {
%predicate = icmp eq i8 %0, 1
%llvmbool = call i1 @$intrinsic(i32 %mask, i1 %predicate)
%jlbool = zext i1 %llvmbool to i8
ret i8 %jlbool
}
attributes #0 = { alwaysinline }""", "entry"),
Bool, Tuple{UInt32, Bool}, mask, pred)
end
@eval @inline $fname_sync(mask, pred) =
@typed_ccall($intrinsic, llvmcall, Bool, (UInt32, Bool), mask, pred)
end

# ballot returns an integer, so we need to repeat the above
Expand All @@ -50,37 +22,13 @@ for mode in (:ballot, )
@eval export $fname, $fname_sync

intrinsic = "llvm.nvvm.vote.$mode"
@eval begin
@inline $fname(pred) =
Base.llvmcall($("""
declare i32 @$intrinsic(i1)
define i32 @entry(i8) #0 {
%predicate = icmp eq i8 %0, 1
%ret = call i32 @$intrinsic(i1 %predicate)
ret i32 %ret
}
attributes #0 = { alwaysinline }""", "entry"),
UInt32, Tuple{Bool}, pred)
end
@eval @inline $fname(pred) =
@typed_ccall($intrinsic, llvmcall, UInt32, (Bool,), pred)

# warp-synchronous
intrinsic = "llvm.nvvm.vote.$mode.sync"
@eval begin
@inline $fname_sync(mask, pred) =
Base.llvmcall($("""
declare i32 @$intrinsic(i32, i1)
define i32 @entry(i32 %mask, i8) #0 {
%predicate = icmp eq i8 %0, 1
%ret = call i32 @$intrinsic(i32 %mask, i1 %predicate)
ret i32 %ret
}
attributes #0 = { alwaysinline }""", "entry"),
UInt32, Tuple{UInt32, Bool}, mask, pred)
end
@eval @inline $fname_sync(mask, pred) =
@typed_ccall($intrinsic, llvmcall, UInt32, (UInt32, Bool), mask, pred)
end


Expand Down
2 changes: 1 addition & 1 deletion src/device/pointer.jl
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ for T in LDGTypes
::Val{align}) where align
offset = i-one(i) # in elements
ptr = base_ptr + offset*sizeof($T)
@typed_ccall($intr, llvmcall, $T, (LLVMPtr{$T,AS.Global}, Int32), ptr, align)
@typed_ccall($intr, llvmcall, $T, (LLVMPtr{$T,AS.Global}, Int32), ptr, Val(align))
end
end

Expand Down

0 comments on commit 66fa617

Please sign in to comment.