[clang] [CIR] Support __builtin_coro_align (PR #228821)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 3 21:23:20 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clangir
Author: Aman Maurya (amanmaurya92)
<details>
<summary>Changes</summary>
Support `__builtin_coro_align` in ClangIR:
- Add `CIR_CoroAlignOp` (`cir.coro.intrinsic.align`) in `CIROps.td` with TableGen lowering to `llvm.coro.align`.
- Handle `Builtin::BI__builtin_coro_align` in `CIRGenBuiltin.cpp`.
- Add roundtrip (`clang/test/CIR/IR/coro-align.cir`) and DirectToLLVM lowering (`clang/test/CIR/Lowering/coro-align.cir`) tests.
- Test `__builtin_coro_align()` in `clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp` with both CIR and LLVM checks for parity with classic Clang CodeGen.
Closes #<!-- -->228764
Assisted by Antigravity and reviewed by Aman Maurya.
---
Full diff: https://github.com/llvm/llvm-project/pull/228821.diff
7 Files Affected:
- (modified) clang/include/clang/CIR/Dialect/IR/CIROps.td (+14)
- (modified) clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp (+1-2)
- (modified) clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp (+5)
- (modified) clang/lib/CIR/CodeGen/CIRGenFunction.h (+1)
- (modified) clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp (+5)
- (added) clang/test/CIR/IR/coro-align.cir (+11)
- (added) clang/test/CIR/Lowering/coro-align.cir (+11)
``````````diff
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index e450423c12ce2..70865a69d7c0a 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -5137,6 +5137,20 @@ def CIR_CoroSizeOp : CIR_CoroIntrinsicOp<"size", (ins),
let llvmOp = "CoroSizeOp";
}
+//===----------------------------------------------------------------------===//
+// Coroutine intrinsic AlignOp
+//===----------------------------------------------------------------------===//
+
+def CIR_CoroAlignOp : CIR_CoroIntrinsicOp<"align", (ins),
+ (outs CIR_UInt64:$result)> {
+ let summary = "Represents llvm.coro.align";
+ let description = [{
+ Returns the alignment requirement, in bytes, of the coroutine frame.
+ }];
+ let llvmOp = "CoroAlignOp";
+}
+
+
//===----------------------------------------------------------------------===//
// Coroutine intrinsic PromiseOp
//===----------------------------------------------------------------------===//
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index e9ce52843f1a7..01289492f8f91 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -1829,8 +1829,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
cgm.errorNYI(e->getSourceRange(), "BI__builtin_coro_suspend NYI");
return getUndefRValue(e->getType());
case Builtin::BI__builtin_coro_align:
- cgm.errorNYI(e->getSourceRange(), "BI__builtin_coro_align NYI");
- return getUndefRValue(e->getType());
+ return RValue::get(emitCoroAlignBuiltinCall(e).getResult());
case Builtin::BI__builtin_coro_frame: {
return emitCoroutineFrame();
diff --git a/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp b/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp
index d92c65dc43c5f..7540189fbd51e 100644
--- a/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenCoroutine.cpp
@@ -251,6 +251,11 @@ cir::CoroSizeOp CIRGenFunction::emitCoroSizeBuiltinCall(const CallExpr *e) {
return cir::CoroSizeOp::create(cgm.getBuilder(), loc);
}
+cir::CoroAlignOp CIRGenFunction::emitCoroAlignBuiltinCall(const CallExpr *e) {
+ mlir::Location loc = getLoc(e->getBeginLoc());
+ return cir::CoroAlignOp::create(cgm.getBuilder(), loc);
+}
+
cir::CoroPromiseOp
CIRGenFunction::emitCoroPromiseBuiltinCall(const CallExpr *e) {
mlir::Location loc = getLoc(e->getBeginLoc());
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h
index c6427d60a3792..122eb5392a203 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.h
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h
@@ -2042,6 +2042,7 @@ class CIRGenFunction : public CIRGenTypeCache {
cir::CoroNoopOp emitCoroNoopBuiltinCall(const CallExpr *e);
cir::CoroSizeOp emitCoroSizeBuiltinCall(const CallExpr *e);
+ cir::CoroAlignOp emitCoroAlignBuiltinCall(const CallExpr *e);
cir::CoroFreeOp emitCoroFreeBuiltin(const CallExpr *e);
RValue emitCoroutineFrame();
diff --git a/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp b/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp
index 539151dbd633d..b50b6f81259b9 100644
--- a/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp
+++ b/clang/test/CIR/CodeGenCoroutines/coro-builtins.cpp
@@ -34,6 +34,11 @@ void f(int n) {
// LLVM: %[[NOOP:.*]] = call ptr @llvm.coro.noop()
+ __builtin_coro_align();
+ // CIR: %[[ALIGN:.*]] = cir.coro.intrinsic.align() : () -> !u64i
+
+ // LLVM: %[[ALIGN:.*]] = call i64 @llvm.coro.align.i64()
+
__builtin_coro_begin(myAlloc(__builtin_coro_size()));
// TODO(CIR): Support both variants of the coroutine size intrinsic, matching
// `llvm.coro.size.i32` and `llvm.coro.size.i64`.
diff --git a/clang/test/CIR/IR/coro-align.cir b/clang/test/CIR/IR/coro-align.cir
new file mode 100644
index 0000000000000..a70d3be27c66c
--- /dev/null
+++ b/clang/test/CIR/IR/coro-align.cir
@@ -0,0 +1,11 @@
+// RUN: cir-opt %s --verify-roundtrip | FileCheck %s
+
+!u64i = !cir.int<u, 64>
+
+module {
+ cir.func @test_coro_align() -> !u64i {
+ // CHECK: %0 = cir.coro.intrinsic.align() : () -> !u64i
+ %0 = cir.coro.intrinsic.align() : () -> !u64i
+ cir.return %0 : !u64i
+ }
+}
diff --git a/clang/test/CIR/Lowering/coro-align.cir b/clang/test/CIR/Lowering/coro-align.cir
new file mode 100644
index 0000000000000..2a600018dd4c0
--- /dev/null
+++ b/clang/test/CIR/Lowering/coro-align.cir
@@ -0,0 +1,11 @@
+// RUN: cir-opt %s -cir-to-llvm -o - | FileCheck %s
+
+!u64i = !cir.int<u, 64>
+
+module attributes {cir.triple = "x86_64-unknown-linux-gnu"} {
+ cir.func @test_coro_align() -> !u64i {
+ // CHECK: %0 = llvm.intr.coro.align : i64
+ %0 = cir.coro.intrinsic.align() : () -> !u64i
+ cir.return %0 : !u64i
+ }
+}
``````````
</details>
https://github.com/llvm/llvm-project/pull/228821
More information about the cfe-commits
mailing list