[clang] [ClangIR] Support __builtin_coro_noop (PR #227573)

Aman Maurya via cfe-commits cfe-commits at lists.llvm.org
Fri Oct 2 02:46:59 PDT 2026


https://github.com/amanmaurya92 updated https://github.com/llvm/llvm-project/pull/227573

>From 288273e5a98fcd597f1154d440a2430e974aac83 Mon Sep 17 00:00:00 2001
From: amanmaurya92 <amanmaurya9209 at gmail.com>
Date: Wed, 30 Sep 2026 11:32:34 +0530
Subject: [PATCH] [ClangIR] Support __builtin_coro_noop

Support __builtin_coro_noop in CIRGen and define cir.coro.intrinsic.noop
with lowering to llvm.coro.noop.

Closes #227561

Assisted-by: Antigravity
---
 clang/include/clang/CIR/Dialect/IR/CIROps.td       | 13 +++++++++++++
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp            |  3 +--
 clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp          |  5 +++++
 clang/lib/CIR/CodeGen/CIRGenFunction.h             |  1 +
 clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp |  6 ++++--
 clang/test/CIR/IR/coro-noop.cir                    | 11 +++++++++++
 clang/test/CIR/Lowering/coro-noop.cir              | 11 +++++++++++
 7 files changed, 46 insertions(+), 4 deletions(-)
 create mode 100644 clang/test/CIR/IR/coro-noop.cir
 create mode 100644 clang/test/CIR/Lowering/coro-noop.cir

diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 89e93a716424d..4d57275c9a1df 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -5242,6 +5242,19 @@ def CIR_CoroSuspendPoint : CIR_Op<"coro.suspend_point", [
   let hasLLVMLowering = false;
 }
 
+//===----------------------------------------------------------------------===//
+// Coroutine intrinsic NoopOp
+//===----------------------------------------------------------------------===//
+
+def CIR_CoroNoopOp : CIR_CoroIntrinsicOp<"noop", (ins),
+    (outs CIR_VoidPtrType:$result)> {
+  let summary = "Represents llvm.coro.noop";
+  let description = [{
+    Returns a coroutine handle to a no-op coroutine.
+  }];
+  let llvmOp = "CoroNoopOp";
+}
+
 //===----------------------------------------------------------------------===//
 // CopyOp
 //===----------------------------------------------------------------------===//
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index fe7a63d7bb85d..bc7ceec14facf 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -1811,8 +1811,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
     return RValue::get(nullptr);
   }
   case Builtin::BI__builtin_coro_noop:
-    cgm.errorNYI(e->getSourceRange(), "BI__builtin_coro_noop NYI");
-    return getUndefRValue(e->getType());
+    return RValue::get(emitCoroNoopBuiltinCall(e).getResult());
   case Builtin::BI__builtin_coro_destroy: {
     emitCoroDestroyBuiltinCall(e);
     return RValue::get(nullptr);
diff --git a/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp b/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp
index 71bf3424c087a..d92c65dc43c5f 100644
--- a/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp
@@ -282,6 +282,11 @@ CIRGenFunction::emitCoroDestroyBuiltinCall(const CallExpr *e) {
                                     emitScalarExpr(e->getArg(0)));
 }
 
+cir::CoroNoopOp CIRGenFunction::emitCoroNoopBuiltinCall(const CallExpr *e) {
+  mlir::Location loc = getLoc(e->getBeginLoc());
+  return cir::CoroNoopOp::create(cgm.getBuilder(), loc);
+}
+
 static mlir::LogicalResult
 coroutineBodyExceptionHelper(CIRGenFunction &cgf, const CoroutineBodyStmt &s) {
 
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h
index b232abf5d9299..f603cb770b333 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.h
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h
@@ -2012,6 +2012,7 @@ class CIRGenFunction : public CIRGenTypeCache {
   cir::CoroDoneOp emitCoroDoneBuiltinCall(const CallExpr *e);
   cir::CoroResumeOp emitCoroResumeBuiltinCall(const CallExpr *e);
   cir::CoroDestroyOp emitCoroDestroyBuiltinCall(const CallExpr *e);
+  cir::CoroNoopOp emitCoroNoopBuiltinCall(const CallExpr *e);
 
   cir::CoroSizeOp emitCoroSizeBuiltinCall(const CallExpr *e);
   cir::CoroFreeOp emitCoroFreeBuiltin(const CallExpr *e);
diff --git a/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp b/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp
index db22a0fbaee8b..539151dbd633d 100644
--- a/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp
+++ b/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp
@@ -29,8 +29,10 @@ void f(int n) {
 
   // LLVM: call i1 @llvm.coro.alloc(token %[[COROID]])
 
-  // TODO
-  //__builtin_coro_noop();
+  __builtin_coro_noop();
+  // CIR: %[[NOOP:.*]] = cir.coro.intrinsic.noop() : () -> !cir.ptr<!void>
+
+  // LLVM: %[[NOOP:.*]] = call ptr @llvm.coro.noop()
 
   __builtin_coro_begin(myAlloc(__builtin_coro_size()));
   // TODO(CIR): Support both variants of the coroutine size intrinsic, matching
diff --git a/clang/test/CIR/IR/coro-noop.cir b/clang/test/CIR/IR/coro-noop.cir
new file mode 100644
index 0000000000000..353e5f8d409f1
--- /dev/null
+++ b/clang/test/CIR/IR/coro-noop.cir
@@ -0,0 +1,11 @@
+// RUN: cir-opt %s --verify-roundtrip | FileCheck %s
+
+!void = !cir.void
+
+module {
+  cir.func @test_coro_noop() -> !cir.ptr<!void> {
+    // CHECK: %0 = cir.coro.intrinsic.noop() : () -> !cir.ptr<!void>
+    %0 = cir.coro.intrinsic.noop() : () -> !cir.ptr<!void>
+    cir.return %0 : !cir.ptr<!void>
+  }
+}
diff --git a/clang/test/CIR/Lowering/coro-noop.cir b/clang/test/CIR/Lowering/coro-noop.cir
new file mode 100644
index 0000000000000..6625ac4142117
--- /dev/null
+++ b/clang/test/CIR/Lowering/coro-noop.cir
@@ -0,0 +1,11 @@
+// RUN: cir-opt %s -cir-to-llvm -o - | FileCheck %s
+
+!void = !cir.void
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+  cir.func @test_coro_noop() -> !cir.ptr<!void> {
+    // CHECK: %0 = llvm.intr.coro.noop : !llvm.ptr
+    %0 = cir.coro.intrinsic.noop() : () -> !cir.ptr<!void>
+    cir.return %0 : !cir.ptr<!void>
+  }
+}



More information about the cfe-commits mailing list