https://github.com/xakep8 updated 
https://github.com/llvm/llvm-project/pull/218852

>From 6dfe59e0ab23f80344a6d45125e16dd7295c7085 Mon Sep 17 00:00:00 2001
From: Kunal Dubey <[email protected]>
Date: Wed, 26 Aug 2026 12:48:59 +0530
Subject: [PATCH 1/4] [CIR] Added case for builtins in CIRGen

Added case for stdc_rotate_left, stdc_rotate_right and
stdc_memreverse8 so that they don't fall through to isLibFunction path.
Now they emit NYI.
---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp       | 19 ++++++++++
 .../builtin-stdc-bit-c2y-nyi.c                | 35 +++++++++++++++++++
 2 files changed, 54 insertions(+)
 create mode 100644 clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp 
b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index e2fe3adefd4af..e85475814fed4 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -1726,12 +1726,31 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
   case Builtin::BI__builtin_rotateleft32:
   case Builtin::BI__builtin_rotateleft64:
     return emitRotate(e, /*isRotateLeft=*/true);
+  case Builtin::BI__builtin_stdc_rotate_left:
+  case Builtin::BIstdc_rotate_left_uc:
+  case Builtin::BIstdc_rotate_left_us:
+  case Builtin::BIstdc_rotate_left_ui:
+  case Builtin::BIstdc_rotate_left_ul:
+  case Builtin::BIstdc_rotate_left_ull:
+    return errorBuiltinNYI(*this, e, builtinID);
 
   case Builtin::BI__builtin_rotateright8:
   case Builtin::BI__builtin_rotateright16:
   case Builtin::BI__builtin_rotateright32:
   case Builtin::BI__builtin_rotateright64:
     return emitRotate(e, /*isRotateLeft=*/false);
+  case Builtin::BI__builtin_stdc_rotate_right:
+  case Builtin::BIstdc_rotate_right_uc:
+  case Builtin::BIstdc_rotate_right_us:
+  case Builtin::BIstdc_rotate_right_ui:
+  case Builtin::BIstdc_rotate_right_ul:
+  case Builtin::BIstdc_rotate_right_ull:
+  case Builtin::BIstdc_memreverse8:
+  case Builtin::BIstdc_memreverse8u8:
+  case Builtin::BIstdc_memreverse8u16:
+  case Builtin::BIstdc_memreverse8u32:
+  case Builtin::BIstdc_memreverse8u64:
+    return errorBuiltinNYI(*this, e, builtinID);
 
   case Builtin::BI__builtin_coro_id:
     return RValue::get(emitCoroIDBuiltinCall(e).getResult());
diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c 
b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c
new file mode 100644
index 0000000000000..f6dd75f8cbe21
--- /dev/null
+++ b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c
@@ -0,0 +1,35 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DSTDC_ROTATE_LEFT %s -o -
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DSTDC_ROTATE_RIGHT %s -o -
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DSTDC_MEMREVERSE8 %s -o -
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -emit-llvm %s -o 
- | FileCheck %s --check-prefix=OGCG
+
+unsigned stdc_rotate_left_ui(unsigned, unsigned);
+unsigned stdc_rotate_right_ui(unsigned, unsigned);
+unsigned stdc_memreverse8u32(unsigned);
+
+#if !defined(STDC_ROTATE_RIGHT) && !defined(STDC_MEMREVERSE8)
+unsigned test_stdc_rotate_left_ui(unsigned x) {
+  return stdc_rotate_left_ui(x, 1); // expected-error {{ClangIR code gen Not 
Yet Implemented: unimplemented X86 builtin call: stdc_rotate_left_ui}}
+}
+
+// OGCG-LABEL: define{{.*}} i32 @test_stdc_rotate_left_ui(
+// OGCG: call i32 @llvm.fshl.i32(
+#endif
+
+#if !defined(STDC_ROTATE_LEFT) && !defined(STDC_MEMREVERSE8)
+unsigned test_stdc_rotate_right_ui(unsigned x) {
+  return stdc_rotate_right_ui(x, 1); // expected-error {{ClangIR code gen Not 
Yet Implemented: unimplemented X86 builtin call: stdc_rotate_right_ui}}
+}
+
+// OGCG-LABEL: define{{.*}} i32 @test_stdc_rotate_right_ui(
+// OGCG: call i32 @llvm.fshr.i32(
+#endif
+
+#if !defined(STDC_ROTATE_LEFT) && !defined(STDC_ROTATE_RIGHT)
+unsigned test_stdc_memreverse8u32(unsigned x) {
+  return stdc_memreverse8u32(x); // expected-error {{ClangIR code gen Not Yet 
Implemented: unimplemented X86 builtin call: stdc_memreverse8u32}}
+}
+
+// OGCG-LABEL: define{{.*}} i32 @test_stdc_memreverse8u32(
+// OGCG: call i32 @llvm.bswap.i32(
+#endif

>From c39525268c6078a3021e650bb67e78237fd0994e Mon Sep 17 00:00:00 2001
From: Kunal Dubey <[email protected]>
Date: Wed, 26 Aug 2026 15:09:12 +0530
Subject: [PATCH 2/4] [CIR] Lower C2Y stdc rotate and memreverse builtins

Lowered the C2y stdc_rotate_left/right builtins through cir.rotate, also
lowered stdc_memreverse8u* builtins using cir.byte_swap.

Kept the generic pointer stdc_memreverse8 form as NYI for now.
---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp       | 17 +++--
 .../builtin-stdc-bit-c2y-nyi.c                | 35 ---------
 .../CodeGenBuiltins/builtin-stdc-bit-c2y.c    | 73 +++++++++++++++++++
 3 files changed, 83 insertions(+), 42 deletions(-)
 delete mode 100644 clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c
 create mode 100644 clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp 
b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index e85475814fed4..00e1fa2ad5140 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -542,10 +542,8 @@ RValue CIRGenFunction::emitRotate(const CallExpr *e, bool 
isRotateLeft) {
   mlir::Value input = emitScalarExpr(e->getArg(0));
   mlir::Value amount = emitScalarExpr(e->getArg(1));
 
-  // TODO(cir): MSVC flavor bit rotate builtins use different types for input
-  // and amount, but cir.rotate requires them to have the same type. Cast 
amount
-  // to the type of input when necessary.
-  assert(!cir::MissingFeatures::msvcBuiltins());
+  if (amount.getType() != input.getType())
+    amount = builder.createIntCast(amount, input.getType());
 
   auto r = cir::RotateOp::create(builder, getLoc(e->getSourceRange()), input,
                                  amount, isRotateLeft);
@@ -1732,7 +1730,7 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
   case Builtin::BIstdc_rotate_left_ui:
   case Builtin::BIstdc_rotate_left_ul:
   case Builtin::BIstdc_rotate_left_ull:
-    return errorBuiltinNYI(*this, e, builtinID);
+    return emitRotate(e, /*isRotateLeft=*/true);
 
   case Builtin::BI__builtin_rotateright8:
   case Builtin::BI__builtin_rotateright16:
@@ -1745,11 +1743,16 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
   case Builtin::BIstdc_rotate_right_ui:
   case Builtin::BIstdc_rotate_right_ul:
   case Builtin::BIstdc_rotate_right_ull:
-  case Builtin::BIstdc_memreverse8:
+    return emitRotate(e, /*isRotateLeft=*/false);
   case Builtin::BIstdc_memreverse8u8:
+    return RValue::get(emitScalarExpr(e->getArg(0)));
   case Builtin::BIstdc_memreverse8u16:
   case Builtin::BIstdc_memreverse8u32:
-  case Builtin::BIstdc_memreverse8u64:
+  case Builtin::BIstdc_memreverse8u64: {
+    mlir::Value arg = emitScalarExpr(e->getArg(0));
+    return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
+  }
+  case Builtin::BIstdc_memreverse8:
     return errorBuiltinNYI(*this, e, builtinID);
 
   case Builtin::BI__builtin_coro_id:
diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c 
b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c
deleted file mode 100644
index f6dd75f8cbe21..0000000000000
--- a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y-nyi.c
+++ /dev/null
@@ -1,35 +0,0 @@
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DSTDC_ROTATE_LEFT %s -o -
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DSTDC_ROTATE_RIGHT %s -o -
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DSTDC_MEMREVERSE8 %s -o -
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -emit-llvm %s -o 
- | FileCheck %s --check-prefix=OGCG
-
-unsigned stdc_rotate_left_ui(unsigned, unsigned);
-unsigned stdc_rotate_right_ui(unsigned, unsigned);
-unsigned stdc_memreverse8u32(unsigned);
-
-#if !defined(STDC_ROTATE_RIGHT) && !defined(STDC_MEMREVERSE8)
-unsigned test_stdc_rotate_left_ui(unsigned x) {
-  return stdc_rotate_left_ui(x, 1); // expected-error {{ClangIR code gen Not 
Yet Implemented: unimplemented X86 builtin call: stdc_rotate_left_ui}}
-}
-
-// OGCG-LABEL: define{{.*}} i32 @test_stdc_rotate_left_ui(
-// OGCG: call i32 @llvm.fshl.i32(
-#endif
-
-#if !defined(STDC_ROTATE_LEFT) && !defined(STDC_MEMREVERSE8)
-unsigned test_stdc_rotate_right_ui(unsigned x) {
-  return stdc_rotate_right_ui(x, 1); // expected-error {{ClangIR code gen Not 
Yet Implemented: unimplemented X86 builtin call: stdc_rotate_right_ui}}
-}
-
-// OGCG-LABEL: define{{.*}} i32 @test_stdc_rotate_right_ui(
-// OGCG: call i32 @llvm.fshr.i32(
-#endif
-
-#if !defined(STDC_ROTATE_LEFT) && !defined(STDC_ROTATE_RIGHT)
-unsigned test_stdc_memreverse8u32(unsigned x) {
-  return stdc_memreverse8u32(x); // expected-error {{ClangIR code gen Not Yet 
Implemented: unimplemented X86 builtin call: stdc_memreverse8u32}}
-}
-
-// OGCG-LABEL: define{{.*}} i32 @test_stdc_memreverse8u32(
-// OGCG: call i32 @llvm.bswap.i32(
-#endif
diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c 
b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
new file mode 100644
index 0000000000000..ec42db73d6e26
--- /dev/null
+++ b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
@@ -0,0 +1,73 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir %s -o - | FileCheck %s --check-prefix=CIR
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -emit-llvm %s -o 
- | FileCheck %s --check-prefix=OGCG
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DNYI_MEMREVERSE8 %s -o -
+
+typedef __SIZE_TYPE__ size_t;
+
+unsigned char stdc_rotate_left_uc(unsigned char, unsigned);
+unsigned long long stdc_rotate_right_ull(unsigned long long, unsigned);
+unsigned char stdc_memreverse8u8(unsigned char);
+unsigned stdc_memreverse8u32(unsigned);
+void stdc_memreverse8(size_t, unsigned char *);
+
+#ifndef NYI_MEMREVERSE8
+unsigned char test_stdc_rotate_left_uc(unsigned char x, unsigned amount) {
+  return stdc_rotate_left_uc(x, amount);
+}
+
+// CIR-LABEL: test_stdc_rotate_left_uc
+// CIR: cir.cast integral {{.*}} : !u32i -> !u8i
+// CIR: cir.rotate left {{.*}} : !u8i
+
+// LLVM-LABEL: test_stdc_rotate_left_uc
+// LLVM: call i8 @llvm.fshl.i8(
+
+// OGCG-LABEL: test_stdc_rotate_left_uc
+// OGCG: call i8 @llvm.fshl.i8(
+
+unsigned long long test_stdc_rotate_right_ull(unsigned long long x,
+                                              unsigned amount) {
+  return stdc_rotate_right_ull(x, amount);
+}
+
+// CIR-LABEL: test_stdc_rotate_right_ull
+// CIR: cir.cast integral {{.*}} : !u32i -> !u64i
+// CIR: cir.rotate right {{.*}} : !u64i
+
+// LLVM-LABEL: test_stdc_rotate_right_ull
+// LLVM: call i64 @llvm.fshr.i64(
+
+// OGCG-LABEL: test_stdc_rotate_right_ull
+// OGCG: call i64 @llvm.fshr.i64(
+
+unsigned char test_stdc_memreverse8u8(unsigned char x) {
+  return stdc_memreverse8u8(x);
+}
+
+// CIR-LABEL: test_stdc_memreverse8u8
+// CIR-NOT: cir.byte_swap
+
+// LLVM-LABEL: test_stdc_memreverse8u8
+// LLVM-NOT: @llvm.bswap
+
+// OGCG-LABEL: test_stdc_memreverse8u8
+// OGCG-NOT: @llvm.bswap
+
+unsigned test_stdc_memreverse8u32(unsigned x) {
+  return stdc_memreverse8u32(x);
+}
+
+// CIR-LABEL: test_stdc_memreverse8u32
+// CIR: cir.byte_swap {{.*}} : !u32i
+
+// LLVM-LABEL: test_stdc_memreverse8u32
+// LLVM: call i32 @llvm.bswap.i32(
+
+// OGCG-LABEL: test_stdc_memreverse8u32
+// OGCG: call i32 @llvm.bswap.i32(
+#else
+void test_stdc_memreverse8(unsigned char *p) {
+  stdc_memreverse8(4, p); // expected-error {{ClangIR code gen Not Yet 
Implemented: unimplemented X86 builtin call: stdc_memreverse8}}
+}
+#endif

>From 70e255f8a50f223e032bcc5e7716db19375970a2 Mon Sep 17 00:00:00 2001
From: Kunal Dubey <[email protected]>
Date: Wed, 16 Sep 2026 22:31:24 +0530
Subject: [PATCH 3/4] [CIR] Aligned C2Y stdc rotate and memreverse tests with
 CodeGen

---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp       |  4 +--
 .../CodeGenBuiltins/builtin-stdc-bit-c2y.c    | 28 ++++---------------
 2 files changed, 7 insertions(+), 25 deletions(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp 
b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index 00e1fa2ad5140..ea4c46de25726 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -1723,7 +1723,6 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
   case Builtin::BI__builtin_rotateleft16:
   case Builtin::BI__builtin_rotateleft32:
   case Builtin::BI__builtin_rotateleft64:
-    return emitRotate(e, /*isRotateLeft=*/true);
   case Builtin::BI__builtin_stdc_rotate_left:
   case Builtin::BIstdc_rotate_left_uc:
   case Builtin::BIstdc_rotate_left_us:
@@ -1736,7 +1735,6 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
   case Builtin::BI__builtin_rotateright16:
   case Builtin::BI__builtin_rotateright32:
   case Builtin::BI__builtin_rotateright64:
-    return emitRotate(e, /*isRotateLeft=*/false);
   case Builtin::BI__builtin_stdc_rotate_right:
   case Builtin::BIstdc_rotate_right_uc:
   case Builtin::BIstdc_rotate_right_us:
@@ -1744,6 +1742,8 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
   case Builtin::BIstdc_rotate_right_ul:
   case Builtin::BIstdc_rotate_right_ull:
     return emitRotate(e, /*isRotateLeft=*/false);
+
+  // stdc_memreverse8u8 is a no-op (single byte, nothing to swap).
   case Builtin::BIstdc_memreverse8u8:
     return RValue::get(emitScalarExpr(e->getArg(0)));
   case Builtin::BIstdc_memreverse8u16:
diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c 
b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
index ec42db73d6e26..87da785445304 100644
--- a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
+++ b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
@@ -1,17 +1,12 @@
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir %s -o - | FileCheck %s --check-prefix=CIR
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -emit-llvm %s -o 
- | FileCheck %s --check-prefix=OGCG
-// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-cir -verify -DNYI_MEMREVERSE8 %s -o -
-
-typedef __SIZE_TYPE__ size_t;
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -emit-llvm %s -o 
- | FileCheck %s --check-prefix=LLVM
 
 unsigned char stdc_rotate_left_uc(unsigned char, unsigned);
 unsigned long long stdc_rotate_right_ull(unsigned long long, unsigned);
 unsigned char stdc_memreverse8u8(unsigned char);
 unsigned stdc_memreverse8u32(unsigned);
-void stdc_memreverse8(size_t, unsigned char *);
 
-#ifndef NYI_MEMREVERSE8
 unsigned char test_stdc_rotate_left_uc(unsigned char x, unsigned amount) {
   return stdc_rotate_left_uc(x, amount);
 }
@@ -23,9 +18,6 @@ unsigned char test_stdc_rotate_left_uc(unsigned char x, 
unsigned amount) {
 // LLVM-LABEL: test_stdc_rotate_left_uc
 // LLVM: call i8 @llvm.fshl.i8(
 
-// OGCG-LABEL: test_stdc_rotate_left_uc
-// OGCG: call i8 @llvm.fshl.i8(
-
 unsigned long long test_stdc_rotate_right_ull(unsigned long long x,
                                               unsigned amount) {
   return stdc_rotate_right_ull(x, amount);
@@ -38,21 +30,19 @@ unsigned long long test_stdc_rotate_right_ull(unsigned long 
long x,
 // LLVM-LABEL: test_stdc_rotate_right_ull
 // LLVM: call i64 @llvm.fshr.i64(
 
-// OGCG-LABEL: test_stdc_rotate_right_ull
-// OGCG: call i64 @llvm.fshr.i64(
-
 unsigned char test_stdc_memreverse8u8(unsigned char x) {
   return stdc_memreverse8u8(x);
 }
 
 // CIR-LABEL: test_stdc_memreverse8u8
 // CIR-NOT: cir.byte_swap
+// CIR-NOT: cir.call
+// CIR: cir.return
 
 // LLVM-LABEL: test_stdc_memreverse8u8
 // LLVM-NOT: @llvm.bswap
-
-// OGCG-LABEL: test_stdc_memreverse8u8
-// OGCG-NOT: @llvm.bswap
+// LLVM-NOT: call
+// LLVM: ret i8
 
 unsigned test_stdc_memreverse8u32(unsigned x) {
   return stdc_memreverse8u32(x);
@@ -63,11 +53,3 @@ unsigned test_stdc_memreverse8u32(unsigned x) {
 
 // LLVM-LABEL: test_stdc_memreverse8u32
 // LLVM: call i32 @llvm.bswap.i32(
-
-// OGCG-LABEL: test_stdc_memreverse8u32
-// OGCG: call i32 @llvm.bswap.i32(
-#else
-void test_stdc_memreverse8(unsigned char *p) {
-  stdc_memreverse8(4, p); // expected-error {{ClangIR code gen Not Yet 
Implemented: unimplemented X86 builtin call: stdc_memreverse8}}
-}
-#endif

>From 0e6ba4af02f6a3935f587aa6b4fb25cb008c2d95 Mon Sep 17 00:00:00 2001
From: Kunal Dubey <[email protected]>
Date: Thu, 17 Sep 2026 02:28:29 +0530
Subject: [PATCH 4/4] [CIR] Added stdc_memreverse8 lowering

Matched the classic CodeGen behaviour for constant sizes by treating sizes 0 
and 1
as no-op, lowering 2, 4, and 8 to byte swap and letting the rest fall
through the isLibFunction path.
---
 clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp       | 23 ++++++-
 .../CodeGenBuiltins/builtin-stdc-bit-c2y.c    | 61 +++++++++++++++++++
 2 files changed, 83 insertions(+), 1 deletion(-)

diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp 
b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
index ea4c46de25726..f86385c733044 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp
@@ -1753,7 +1753,28 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl 
&gd, unsigned builtinID,
     return RValue::get(cir::ByteSwapOp::create(builder, loc, arg));
   }
   case Builtin::BIstdc_memreverse8:
-    return errorBuiltinNYI(*this, e, builtinID);
+  case Builtin::BI__builtin_stdc_memreverse8: {
+    Expr::EvalResult result;
+    if (e->getArg(0)->EvaluateAsInt(result, getContext())) {
+      uint64_t size = result.Val.getInt().getZExtValue();
+      if (size <= 1) {
+        emitIgnoredExpr(e->getArg(1));
+        return RValue::get(nullptr);
+      }
+      if (size == 2 || size == 4 || size == 8) {
+        mlir::Location loc = getLoc(e->getSourceRange());
+        Address ptrAddr = emitPointerWithAlignment(e->getArg(1));
+        mlir::Type intTy = builder.getUIntNTy(size * 8);
+        Address addr = builder.createElementBitCast(loc, ptrAddr, intTy);
+        mlir::Value val = builder.createLoad(loc, addr);
+        mlir::Value swapped = cir::ByteSwapOp::create(builder, loc, val);
+        builder.createStore(loc, swapped, addr);
+        return RValue::get(nullptr);
+      }
+    }
+    // General case: fall back to the library function stdc_memreverse8.
+    break;
+  }
 
   case Builtin::BI__builtin_coro_id:
     return RValue::get(emitCoroIDBuiltinCall(e).getResult());
diff --git a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c 
b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
index 87da785445304..3921ab6926d68 100644
--- a/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
+++ b/clang/test/CIR/CodeGenBuiltins/builtin-stdc-bit-c2y.c
@@ -2,10 +2,13 @@
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -fclangir 
-emit-llvm %s -o - | FileCheck %s --check-prefix=LLVM
 // RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -std=c2y -emit-llvm %s -o 
- | FileCheck %s --check-prefix=LLVM
 
+typedef __SIZE_TYPE__ size_t;
+
 unsigned char stdc_rotate_left_uc(unsigned char, unsigned);
 unsigned long long stdc_rotate_right_ull(unsigned long long, unsigned);
 unsigned char stdc_memreverse8u8(unsigned char);
 unsigned stdc_memreverse8u32(unsigned);
+void stdc_memreverse8(size_t, unsigned char *);
 
 unsigned char test_stdc_rotate_left_uc(unsigned char x, unsigned amount) {
   return stdc_rotate_left_uc(x, amount);
@@ -53,3 +56,61 @@ unsigned test_stdc_memreverse8u32(unsigned x) {
 
 // LLVM-LABEL: test_stdc_memreverse8u32
 // LLVM: call i32 @llvm.bswap.i32(
+
+void test_stdc_memreverse8_zero(unsigned char *p) {
+  stdc_memreverse8(0, p);
+}
+
+// CIR-LABEL: test_stdc_memreverse8_zero
+// CIR-NOT: cir.byte_swap
+// CIR-NOT: cir.call
+// CIR: cir.return
+
+// LLVM-LABEL: test_stdc_memreverse8_zero
+// LLVM-NOT: @llvm.bswap
+// LLVM-NOT: call
+// LLVM: ret void
+
+void test_stdc_memreverse8_u32(unsigned char *p) {
+  stdc_memreverse8(4, p);
+}
+
+// CIR-LABEL: test_stdc_memreverse8_u32
+// CIR: cir.byte_swap {{.*}} : !u32i
+// CIR: cir.store
+
+// LLVM-LABEL: test_stdc_memreverse8_u32
+// LLVM: call i32 @llvm.bswap.i32(
+// LLVM: store i32
+
+void test_builtin_stdc_memreverse8_u64(unsigned char *p) {
+  __builtin_stdc_memreverse8(8, p);
+}
+
+// CIR-LABEL: test_builtin_stdc_memreverse8_u64
+// CIR: cir.byte_swap {{.*}} : !u64i
+// CIR: cir.store
+
+// LLVM-LABEL: test_builtin_stdc_memreverse8_u64
+// LLVM: call i64 @llvm.bswap.i64(
+// LLVM: store i64
+
+void test_builtin_stdc_memreverse8_size3(unsigned char *p) {
+  __builtin_stdc_memreverse8(3, p);
+}
+
+// CIR-LABEL: test_builtin_stdc_memreverse8_size3
+// CIR: cir.call @stdc_memreverse8
+
+// LLVM-LABEL: test_builtin_stdc_memreverse8_size3
+// LLVM: call void @stdc_memreverse8(
+
+void test_builtin_stdc_memreverse8_dynamic(size_t n, unsigned char *p) {
+  __builtin_stdc_memreverse8(n, p);
+}
+
+// CIR-LABEL: test_builtin_stdc_memreverse8_dynamic
+// CIR: cir.call @stdc_memreverse8
+
+// LLVM-LABEL: test_builtin_stdc_memreverse8_dynamic
+// LLVM: call void @stdc_memreverse8(

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to