[clang] [CIR] Implement OpenMPRequiredSimdAlign UnaryExpr (PR #184214)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Mon Mar 2 11:54:11 PST 2026
https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/184214
Implement the OpenMPRequiredSimdAlign kind of UnaryExprOrTypeTraitExpr
>From a98bb5f53dbbb683a6a51e81ad93f168fc428851 Mon Sep 17 00:00:00 2001
From: Amr Hesham <amr96 at programmer.net>
Date: Mon, 2 Mar 2026 20:45:40 +0100
Subject: [PATCH] [CIR] Implement OpenMPRequiredSimdAlign UnaryExpr
---
clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp | 12 ++++----
.../CIR/CodeGen/openmp_default_simd_align.c | 28 +++++++++++++++++++
2 files changed, 34 insertions(+), 6 deletions(-)
create mode 100644 clang/test/CIR/CodeGen/openmp_default_simd_align.c
diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
index 03c8369753f35..0e53a96572b65 100644
--- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
@@ -2632,12 +2632,12 @@ mlir::Value ScalarExprEmitter::VisitUnaryExprOrTypeTraitExpr(
}
}
} else if (e->getKind() == UETT_OpenMPRequiredSimdAlign) {
- cgf.getCIRGenModule().errorNYI(
- e->getSourceRange(), "sizeof operator for OpenMpRequiredSimdAlign",
- e->getStmtClassName());
- return builder.getConstant(
- loc, cir::IntAttr::get(cgf.cgm.uInt64Ty,
- llvm::APSInt(llvm::APInt(64, 1), true)));
+ clang::CharUnits::QuantityType alignment =
+ cgf.getContext()
+ .toCharUnitsFromBits(cgf.getContext().getOpenMPDefaultSimdAlign(
+ e->getTypeOfArgument()->getPointeeType()))
+ .getQuantity();
+ return builder.getConstantInt(loc, cgf.cgm.sizeTy, alignment);
} else if (e->getKind() == UETT_VectorElements) {
auto vecTy = cast<cir::VectorType>(convertType(e->getTypeOfArgument()));
if (vecTy.getIsScalable()) {
diff --git a/clang/test/CIR/CodeGen/openmp_default_simd_align.c b/clang/test/CIR/CodeGen/openmp_default_simd_align.c
new file mode 100644
index 0000000000000..8b4e25d8d09d9
--- /dev/null
+++ b/clang/test/CIR/CodeGen/openmp_default_simd_align.c
@@ -0,0 +1,28 @@
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-cir %s -o %t.cir
+// RUN: FileCheck --input-file=%t.cir %s -check-prefix=CIR
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -fclangir -emit-llvm %s -o %t-cir.ll
+// RUN: FileCheck --input-file=%t-cir.ll %s -check-prefix=LLVM
+// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -Wno-unused-value -emit-llvm %s -o %t.ll
+// RUN: FileCheck --input-file=%t.ll %s -check-prefix=OGCG
+
+enum e0 { E0 };
+struct s0 {
+ enum e0 a:31;
+};
+
+int f0(void) {
+ return __builtin_omp_required_simd_align(struct s0);
+}
+
+// CIR: %[[RET_ADDR:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
+// CIR: %[[CONST_16:.*]] = cir.const #cir.int<16> : !s32i
+// CIR: cir.store %[[CONST_16]], %[[RET_ADDR]] : !s32i, !cir.ptr<!s32i>
+// CIR: %[[TMP_RET:.*]] = cir.load %[[RET_ADDR]] : !cir.ptr<!s32i>, !s32i
+// CIR: cir.return %[[TMP_RET]] : !s32i
+
+// LLVM: %[[RET_ADDR:.*]] = alloca i32
+// LLVM: store i32 16, ptr %[[RET_ADDR]], align 4
+// LLVM: %[[TMP_RET:.*]] = load i32, ptr %[[RET_ADDR]], align 4
+// LLVM: ret i32 %[[TMP_RET]]
+
+// OGCG: ret i32 16
More information about the cfe-commits
mailing list