From ca8b9e4142852fb42fa696bd53e37c643cfe413b Mon Sep 17 00:00:00 2001 From: Erik Eckstein Date: Fri, 18 Jul 2025 14:08:42 +0200 Subject: [PATCH 1/2] - add _assumeNonNegative to Span.count --- stdlib/public/core/Span/Span.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/stdlib/public/core/Span/Span.swift b/stdlib/public/core/Span/Span.swift index fafa9b8e92818..c5bb8f871e1e7 100644 --- a/stdlib/public/core/Span/Span.swift +++ b/stdlib/public/core/Span/Span.swift @@ -391,7 +391,7 @@ extension Span where Element: ~Copyable { /// - Complexity: O(1) @_alwaysEmitIntoClient @_semantics("fixed_storage.get_count") - public var count: Int { _count } + public var count: Int { _assumeNonNegative(_count) } /// A Boolean value indicating whether the span is empty. /// @@ -408,7 +408,7 @@ extension Span where Element: ~Copyable { /// - Complexity: O(1) @_alwaysEmitIntoClient public var indices: Range { - unsafe Range(_uncheckedBounds: (0, _count)) + unsafe Range(_uncheckedBounds: (0, count)) } } From 451290dae187bcbdc1af30b082234b812983c6cb Mon Sep 17 00:00:00 2001 From: Erik Eckstein Date: Fri, 18 Jul 2025 14:36:30 +0200 Subject: [PATCH 2/2] - IRGen _assumeNonNegative to an llvm.assume intrinsic --- lib/IRGen/GenBuiltin.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/IRGen/GenBuiltin.cpp b/lib/IRGen/GenBuiltin.cpp index 8ea91091de335..2a0ca5586c91d 100644 --- a/lib/IRGen/GenBuiltin.cpp +++ b/lib/IRGen/GenBuiltin.cpp @@ -626,6 +626,9 @@ void irgen::emitBuiltinCall(IRGenFunction &IGF, const BuiltinInfo &Builtin, llvm::MDNode *range = llvm::MDNode::get(ctx, rangeElems); I->setMetadata(llvm::LLVMContext::MD_range, range); } + } else { + auto *cmp = IGF.Builder.CreateICmpSGE(v, llvm::ConstantInt::get(v->getType(), 0)); + IGF.Builder.CreateIntrinsicCall(llvm::Intrinsic::assume, cmp); } // Don't generate any code for the builtin. return out.add(v);