From a64ad996f1bb7fb17b7f51efb233fd70ff928a22 Mon Sep 17 00:00:00 2001 From: Gabriel Baraldi Date: Tue, 12 Aug 2025 14:30:06 -0300 Subject: [PATCH 1/2] Fix compile time regression for null ptr comparisons (#59259) Fixes the compile time regression in https://github.com/JuliaLang/julia/issues/59134 (does not address the performance regression that should be tracked and bisected) (cherry picked from commit 920df7abc9b5bf47d0589d9768b41e41421ad683) --- src/cgutils.cpp | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index 180c8fdfb0021..fc3245f8773d0 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -1395,6 +1395,18 @@ static void undef_var_error_ifnot(jl_codectx_t &ctx, Value *ok, jl_sym_t *name, ctx.builder.SetInsertPoint(ifok); } + +static bool has_known_null_nullptr(Type *T) +{ + if (auto PT = cast(T)) { + auto addrspace = PT->getAddressSpace(); + if (addrspace == AddressSpace::Generic || (AddressSpace::FirstSpecial <= addrspace && addrspace <= AddressSpace::LastSpecial)) { + return true; + } + } + return false; +} + // 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 @@ -1402,10 +1414,11 @@ static Value *null_pointer_cmp(jl_codectx_t &ctx, Value *v) { ++EmittedNullchecks; Type *T = v->getType(); - return ctx.builder.CreateICmpNE( - v, - ctx.builder.CreateAddrSpaceCast( - Constant::getNullValue(ctx.builder.getPtrTy(0)), T)); + if (has_known_null_nullptr(T)) + return ctx.builder.CreateIsNotNull(v); + else + return ctx.builder.CreateICmpNE(v, ctx.builder.CreateAddrSpaceCast( + Constant::getNullValue(ctx.builder.getPtrTy(0)), T)); } From b4b882473206d58c83e649c56e95d24b5318aa5d Mon Sep 17 00:00:00 2001 From: gbaraldi Date: Fri, 5 Sep 2025 13:06:47 -0300 Subject: [PATCH 2/2] Fixup backport --- src/cgutils.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/cgutils.cpp b/src/cgutils.cpp index fc3245f8773d0..f6ec4f36c9fac 100644 --- a/src/cgutils.cpp +++ b/src/cgutils.cpp @@ -1398,7 +1398,7 @@ static void undef_var_error_ifnot(jl_codectx_t &ctx, Value *ok, jl_sym_t *name, static bool has_known_null_nullptr(Type *T) { - if (auto PT = cast(T)) { + if (auto PT = dyn_cast(T)) { auto addrspace = PT->getAddressSpace(); if (addrspace == AddressSpace::Generic || (AddressSpace::FirstSpecial <= addrspace && addrspace <= AddressSpace::LastSpecial)) { return true; @@ -1414,7 +1414,7 @@ static Value *null_pointer_cmp(jl_codectx_t &ctx, Value *v) { ++EmittedNullchecks; Type *T = v->getType(); - if (has_known_null_nullptr(T)) + if (has_known_null_nullptr(T) || !isa(T)) // i64/i32 are considered pointer like here return ctx.builder.CreateIsNotNull(v); else return ctx.builder.CreateICmpNE(v, ctx.builder.CreateAddrSpaceCast(