Skip to content

Commit

Permalink
Fixes for bitcast bugs with LLVM 17 / opaque pointers (#54548)
Browse files Browse the repository at this point in the history
Skip setName on folded inputs, and ensure
the correct pointer address space is used.

(cherry picked from commit baca8ba)
  • Loading branch information
maleadt authored and KristofferC committed Jun 7, 2024
1 parent ddd5c28 commit 4bc3d07
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 2 deletions.
15 changes: 13 additions & 2 deletions src/intrinsics.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -628,10 +628,21 @@ static jl_cgval_t generic_bitcast(jl_codectx_t &ctx, ArrayRef<jl_cgval_t> argv)
setName(ctx.emission_context, vx, "bitcast_coercion");
} else if (!vxt->isPointerTy() && llvmt->isPointerTy()) {
vx = emit_inttoptr(ctx, vx, llvmt);
setName(ctx.emission_context, vx, "bitcast_coercion");
} else if (vxt->isPointerTy() && llvmt->isPointerTy()) {
// emit_bitcast preserves the origin address space, which we can't have here
#if JL_LLVM_VERSION >= 170000
vx = ctx.builder.CreateAddrSpaceCast(vx, llvmt);
#else
vx = ctx.builder.CreatePointerBitCastOrAddrSpaceCast(vx, llvmt);
#endif
if (isa<Instruction>(vx) && !vx->hasName())
// cast may have been folded
setName(ctx.emission_context, vx, "bitcast_coercion");
} else {
vx = emit_bitcast(ctx, vx, llvmt);
setName(ctx.emission_context, vx, "bitcast_coercion");
if (isa<Instruction>(vx) && !vx->hasName())
// emit_bitcast may undo another bitcast
setName(ctx.emission_context, vx, "bitcast_coercion");
}
}

Expand Down
13 changes: 13 additions & 0 deletions test/intrinsics.jl
Original file line number Diff line number Diff line change
Expand Up @@ -345,3 +345,16 @@ Base.show(io::IO, a::IntWrap) = print(io, "IntWrap(", a.x, ")")
@test r2 isa IntWrap && r2.x === 103 === r[].x && r2 !== r[]
end
end)()

@testset "issue #54548" begin
@inline passthrough(ptr::Core.LLVMPtr{T,A}) where {T,A} = Base.llvmcall(("""
define ptr addrspace(1) @entry(ptr addrspace(1) %0) #0 {
entry:
ret ptr addrspace(1) %0
}
attributes #0 = { alwaysinline }""", "entry"),
Core.LLVMPtr{T,A}, Tuple{Core.LLVMPtr{T,A}}, ptr)
f(gws) = passthrough(Core.bitcast(Core.LLVMPtr{UInt32,1}, gws))
f(C_NULL)
end

0 comments on commit 4bc3d07

Please sign in to comment.