diff --git a/emper/io/IoContext.cpp b/emper/io/IoContext.cpp
index e28262b8fc12d4787b330e24ebd59603912b0550..d69e8d1054aefa6ab56d03672fde0b111b07f328 100644
--- a/emper/io/IoContext.cpp
+++ b/emper/io/IoContext.cpp
@@ -31,13 +31,20 @@
 static const uintptr_t IOCONTEXT_TAG = 1L << (sizeof(size_t) * 8 - 1);
 static const uintptr_t IOCONTEXT_TAG_MASK = IOCONTEXT_TAG - 1;
 
-static inline auto isIoContext(uintptr_t ptr) -> bool { return (ptr & IOCONTEXT_TAG) != 0; }
+namespace emper::io {
+
+static inline auto castIfIoFuture(uintptr_t ptr) -> Future * {
+	if (ptr & IOCONTEXT_TAG) {
+		return nullptr;
+	}
+
+	return reinterpret_cast<Future *>(ptr);
+}
 
 static inline auto stripIoContextTag(uintptr_t ptr) -> IoContext * {
 	return reinterpret_cast<IoContext *>(ptr & IOCONTEXT_TAG_MASK);
 }
 
-namespace emper::io {
 thread_local IoContext *IoContext::workerIo = nullptr;
 
 pthread_t IoContext::globalCompleter;
@@ -258,9 +265,8 @@ auto IoContext::globalCompleterFunc(void *arg) -> void * {
 		auto data = (uintptr_t)io_uring_cqe_get_data(cqe);
 
 		// The cqe is for a completed Future
-		if (unlikely(!isIoContext(data))) {
-			auto *future = reinterpret_cast<Future *>(data);
-
+		auto *future = castIfIoFuture(data);
+		if (unlikely(future)) {
 			uint32_t res = cqe->res;
 			io_uring_cqe_seen(&io.ring, cqe);