From 4c7a750020568cfa593685c349da6a8d05d2d3f6 Mon Sep 17 00:00:00 2001 From: Simeon David Schaub Date: Fri, 27 Jun 2025 16:55:20 +0200 Subject: [PATCH 1/3] fix null comparisons for non-standard address spaces Apparently this is what clang does. Still need to go through other places we create or compare against null pointers. Also needs tests. Thanks to @gbaraldi for helping me debug! fixes JuliaGPU/AMDGPU.jl#780, JuliaGPU/AMDGPU.jl#766 ref ROCm/llvm-project#281 --- src/cgutils.cpp | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index 07b304e5256d1..f8df86095011a 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -1601,10 +1601,18 @@ static void undef_var_error_ifnot(jl_codectx_t &ctx, Value *ok, jl_sym_t *name, ctx.builder.SetInsertPoint(ifok); } +// ctx.builder.CreateIsNotNull(v) lowers incorrectly in non-standard +// address spaces where null is not zero +// TODO: adapt to https://github.com/llvm/llvm-project/pull/131557 once merged static Value *null_pointer_cmp(jl_codectx_t &ctx, Value *v) { ++EmittedNullchecks; - return ctx.builder.CreateIsNotNull(v); + Type *T = v->getType(); + return ctx.builder.CreateICmpNE( + v, + ctx.builder.CreateAddrSpaceCast( + Constant::getNullValue(ctx.builder.getPtrTy(AddressSpace::Derived)), + PointerType::get(T, T->getPointerAddressSpace()))); } From 108341724437b87ec04ed9b506e6624a88e7eb85 Mon Sep 17 00:00:00 2001 From: Simeon David Schaub Date: Sat, 28 Jun 2025 14:52:56 +0200 Subject: [PATCH 2/3] simplify `getNullValue` call Co-authored-by: Jameson Nash --- src/cgutils.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index f8df86095011a..7669a861d668c 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -1611,8 +1611,7 @@ static Value *null_pointer_cmp(jl_codectx_t &ctx, Value *v) return ctx.builder.CreateICmpNE( v, ctx.builder.CreateAddrSpaceCast( - Constant::getNullValue(ctx.builder.getPtrTy(AddressSpace::Derived)), - PointerType::get(T, T->getPointerAddressSpace()))); + Constant::getNullValue(ctx.builder.getPtrTy(0)), T); } From 577c5d1df47f30523f5f5d8b716f6cb666a8d531 Mon Sep 17 00:00:00 2001 From: Simeon David Schaub Date: Sun, 29 Jun 2025 18:32:43 +0200 Subject: [PATCH 3/3] fixup! --- src/cgutils.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index 7669a861d668c..458f0c86d8358 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -1611,7 +1611,7 @@ static Value *null_pointer_cmp(jl_codectx_t &ctx, Value *v) return ctx.builder.CreateICmpNE( v, ctx.builder.CreateAddrSpaceCast( - Constant::getNullValue(ctx.builder.getPtrTy(0)), T); + Constant::getNullValue(ctx.builder.getPtrTy(0)), T)); }