[clang] [CIR][NFC] Add missing CIRGenFPOptionsRAII (PR #218244)
Amr Hesham via cfe-commits
cfe-commits at lists.llvm.org
Sun Aug 23 07:12:49 PDT 2026
https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/218244
Add missing CIRGenFPOptionsRAII to be similar to OGCG
>From 4586959a0d13b28efe57551d61dd97b1b665de9f Mon Sep 17 00:00:00 2001
From: Amr Hesham <amr96 at programmer.net>
Date: Sun, 23 Aug 2026 13:06:06 +0200
Subject: [PATCH] [CIR][NFC] Add missing CIRGenFPOptionsRAII
---
clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp | 27 ++++++++++++++--------
1 file changed, 18 insertions(+), 9 deletions(-)
diff --git a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
index d2193dda37b6f..f6f22811e734e 100644
--- a/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
@@ -710,7 +710,7 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
return {};
}
} else if (type->isRealFloatingType()) {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, e);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, e);
if (type->isHalfType() &&
!cgf.getContext().getLangOpts().NativeHalfType) {
@@ -1378,6 +1378,9 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
mlir::Value lhs = Visit(e->getLHS());
mlir::Value rhs = Visit(e->getRHS());
+ if (cir::isFPOrVectorOfFPType(lhs.getType()))
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, e);
+
auto cmpOpKind = cir::CmpOpKind::ne;
mlir::Type resTy = cgf.convertType(e->getType());
lhs = cir::VecCmpOp::create(builder, loc, resTy, cmpOpKind, lhs, zeroVec);
@@ -2159,7 +2162,7 @@ mlir::Value ScalarExprEmitter::emitMul(const BinOpInfo &ops) {
cgf.cgm.errorNYI("unsigned int overflow sanitizer");
if (cir::isFPOrVectorOfFPType(ops.lhs.getType())) {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ops.fpFeatures);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ops.fpFeatures);
return builder.createFMul(loc, ops.lhs, ops.rhs);
}
@@ -2172,7 +2175,7 @@ mlir::Value ScalarExprEmitter::emitMul(const BinOpInfo &ops) {
mlir::Value ScalarExprEmitter::emitDiv(const BinOpInfo &ops) {
const mlir::Location loc = cgf.getLoc(ops.loc);
if (cir::isFPOrVectorOfFPType(ops.lhs.getType())) {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ops.fpFeatures);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ops.fpFeatures);
return builder.createFDiv(loc, ops.lhs, ops.rhs);
}
@@ -2185,7 +2188,7 @@ mlir::Value ScalarExprEmitter::emitDiv(const BinOpInfo &ops) {
mlir::Value ScalarExprEmitter::emitRem(const BinOpInfo &ops) {
const mlir::Location loc = cgf.getLoc(ops.loc);
if (cir::isFPOrVectorOfFPType(ops.lhs.getType())) {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ops.fpFeatures);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ops.fpFeatures);
return builder.createFRem(loc, ops.lhs, ops.rhs);
}
return cir::RemOp::create(builder, loc, cgf.convertType(ops.fullType),
@@ -2323,7 +2326,7 @@ mlir::Value ScalarExprEmitter::emitAdd(const BinOpInfo &ops) {
cgf.cgm.errorNYI("unsigned int overflow sanitizer");
if (cir::isFPOrVectorOfFPType(ops.lhs.getType())) {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ops.fpFeatures);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ops.fpFeatures);
// Try to form an fmuladd.
if (mlir::Value fmuladd = tryEmitFMulAdd(loc, ops, builder))
return fmuladd;
@@ -2371,7 +2374,7 @@ mlir::Value ScalarExprEmitter::emitSub(const BinOpInfo &ops) {
cgf.cgm.errorNYI("unsigned int overflow sanitizer");
if (cir::isFPOrVectorOfFPType(ops.lhs.getType())) {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ops.fpFeatures);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ops.fpFeatures);
// Try to form an fmuladd.
if (mlir::Value fmuladd =
tryEmitFMulAdd(loc, ops, builder, /*isSub=*/true))
@@ -2471,7 +2474,7 @@ mlir::Value ScalarExprEmitter::VisitCastExpr(CastExpr *ce) {
Expr *subExpr = ce->getSubExpr();
QualType destTy = ce->getType();
CastKind kind = ce->getCastKind();
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ce);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ce);
// These cases are generally not written to ignore the result of evaluating
// their sub-expressions, so we clear this now.
@@ -2745,7 +2748,7 @@ mlir::Value ScalarExprEmitter::VisitCastExpr(CastExpr *ce) {
case CK_FloatingCast:
case CK_FixedPointToFloating:
case CK_FloatingToFixedPoint: {
- CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(cgf, ce);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, ce);
return emitScalarConversion(Visit(subExpr), subExpr->getType(), destTy,
ce->getExprLoc());
}
@@ -2756,9 +2759,11 @@ mlir::Value ScalarExprEmitter::VisitCastExpr(CastExpr *ce) {
case CK_PointerToBoolean:
return emitPointerToBoolConversion(Visit(subExpr), subExpr->getType());
- case CK_FloatingToBoolean:
+ case CK_FloatingToBoolean: {
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, subExpr);
return emitFloatToBoolConversion(Visit(subExpr),
cgf.getLoc(subExpr->getExprLoc()));
+ }
case CK_MemberPointerToBoolean: {
mlir::Value memPtr = Visit(subExpr);
return builder.createCast(cgf.getLoc(ce->getSourceRange()),
@@ -2787,6 +2792,8 @@ mlir::Value ScalarExprEmitter::VisitCallExpr(const CallExpr *e) {
if (e->getCallReturnType(cgf.getContext())->isReferenceType())
return emitLoadOfLValue(e);
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, e);
+
auto v = cgf.emitCallExpr(e).getValue();
assert(!cir::MissingFeatures::emitLValueAlignmentAssumption());
return v;
@@ -2900,6 +2907,8 @@ mlir::Value ScalarExprEmitter::VisitUnaryLNot(const UnaryOperator *e) {
auto operVecTy = mlir::cast<cir::VectorType>(oper.getType());
auto exprVecTy = mlir::cast<cir::VectorType>(cgf.convertType(e->getType()));
mlir::Value zeroVec = builder.getNullValue(operVecTy, loc);
+ if (cir::isFPOrVectorOfFPType(oper.getType()))
+ CIRGenFunction::CIRGenFPOptionsRAII fpOptsRAII(cgf, e);
return cir::VecCmpOp::create(builder, loc, exprVecTy, cir::CmpOpKind::eq,
oper, zeroVec);
}
More information about the cfe-commits
mailing list