[clang] [CIR][NFC] Upstream support for FP environments and RAII options (PR #179121)

Ayokunle Amodu via cfe-commits cfe-commits at lists.llvm.org
Sat Feb 14 06:58:28 PST 2026


https://github.com/ayokunle321 updated https://github.com/llvm/llvm-project/pull/179121

>From 2d0750305d206ef1e63e4ed46b039240441dd9a3 Mon Sep 17 00:00:00 2001
From: Ayokunle Amodu <ayokunle321 at gmail.com>
Date: Sun, 1 Feb 2026 10:20:54 -0700
Subject: [PATCH 1/4] add support for cgFPOptionsRAII

---
 .../CIR/Dialect/Builder/CIRBaseBuilder.h      |  1 +
 clang/include/clang/CIR/Dialect/IR/FPEnv.h    | 50 +++++++++++++
 clang/include/clang/CIR/MissingFeatures.h     |  7 ++
 clang/lib/CIR/CodeGen/CIRGenBuilder.h         | 56 +++++++++++++++
 clang/lib/CIR/CodeGen/CIRGenFunction.cpp      | 70 +++++++++++++++++++
 clang/lib/CIR/CodeGen/CIRGenFunction.h        | 15 ++++
 clang/lib/CIR/Dialect/IR/CMakeLists.txt       |  1 +
 clang/lib/CIR/Dialect/IR/FPEnv.cpp            | 64 +++++++++++++++++
 8 files changed, 264 insertions(+)
 create mode 100644 clang/include/clang/CIR/Dialect/IR/FPEnv.h
 create mode 100644 clang/lib/CIR/Dialect/IR/FPEnv.cpp

diff --git a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
index c35c42c8c506b..770a6337626c4 100644
--- a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
+++ b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
@@ -14,6 +14,7 @@
 #include "clang/CIR/Dialect/IR/CIRAttrs.h"
 #include "clang/CIR/Dialect/IR/CIRDialect.h"
 #include "clang/CIR/Dialect/IR/CIRTypes.h"
+#include "clang/CIR/Dialect/IR/FPEnv.h"
 #include "clang/CIR/MissingFeatures.h"
 #include "llvm/ADT/STLForwardCompat.h"
 #include "llvm/Support/ErrorHandling.h"
diff --git a/clang/include/clang/CIR/Dialect/IR/FPEnv.h b/clang/include/clang/CIR/Dialect/IR/FPEnv.h
new file mode 100644
index 0000000000000..aceba9ee57d05
--- /dev/null
+++ b/clang/include/clang/CIR/Dialect/IR/FPEnv.h
@@ -0,0 +1,50 @@
+//===- FPEnv.h ---- FP Environment ------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+/// @file
+/// This file contains the declarations of entities that describe floating
+/// point environment and related functions.
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef CLANG_CIR_DIALECT_IR_FPENV_H
+#define CLANG_CIR_DIALECT_IR_FPENV_H
+
+#include "llvm/ADT/FloatingPointMode.h"
+
+#include <optional>
+
+namespace cir {
+
+namespace fp {
+
+/// Exception behavior used for floating point operations.
+///
+/// Each of these values corresponds to some LLVMIR metadata argument value of a
+/// constrained floating point intrinsic. See the LLVM Language Reference Manual
+/// for details.
+enum ExceptionBehavior : uint8_t {
+  ebIgnore,  ///< This corresponds to "fpexcept.ignore".
+  ebMayTrap, ///< This corresponds to "fpexcept.maytrap".
+  ebStrict,  ///< This corresponds to "fpexcept.strict".
+};
+
+} // namespace fp
+
+/// For any RoundingMode enumerator, returns a string valid as input in
+/// constrained intrinsic rounding mode metadata.
+std::optional<llvm::StringRef> convertRoundingModeToStr(llvm::RoundingMode);
+
+/// For any ExceptionBehavior enumerator, returns a string valid as input in
+/// constrained intrinsic exception behavior metadata.
+std::optional<llvm::StringRef>
+    convertExceptionBehaviorToStr(fp::ExceptionBehavior);
+
+} // namespace cir
+
+#endif
diff --git a/clang/include/clang/CIR/MissingFeatures.h b/clang/include/clang/CIR/MissingFeatures.h
index cdd9fb950b8b2..c8e61fd217411 100644
--- a/clang/include/clang/CIR/MissingFeatures.h
+++ b/clang/include/clang/CIR/MissingFeatures.h
@@ -278,7 +278,14 @@ struct MissingFeatures {
   static bool emitNullabilityCheck() { return false; }
   static bool emitTypeCheck() { return false; }
   static bool emitTypeMetadataCodeForVCall() { return false; }
+  
+  // Fast math.
+  static bool fastMathGuard() { return false; }
+  // Should be implemented with a moduleOp level attribute and directly
+  // mapped to LLVM - those can be set directly for every relevant LLVM IR
+  // dialect operation (log10, ...).
   static bool fastMathFlags() { return false; }
+  static bool fastMathFuncAttributes() { return false; }
 
   static bool fpConstraints() { return false; }
   static bool generateDebugInfo() { return false; }
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
index dedb369bf3f67..812d9b9c39acf 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h
+++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
@@ -16,6 +16,7 @@
 #include "mlir/IR/BuiltinAttributes.h"
 #include "mlir/Support/LLVM.h"
 #include "clang/CIR/Dialect/IR/CIRDataLayout.h"
+#include "clang/CIR/Dialect/IR/FPEnv.h"
 #include "clang/CIR/MissingFeatures.h"
 
 #include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
@@ -27,6 +28,10 @@ namespace clang::CIRGen {
 
 class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
   const CIRGenTypeCache &typeCache;
+  bool isFPConstrained = false;
+  cir::fp::ExceptionBehavior defaultConstrainedExcept = cir::fp::ebStrict;
+  llvm::RoundingMode defaultConstrainedRounding = llvm::RoundingMode::Dynamic;
+
   llvm::StringMap<unsigned> recordNames;
   llvm::StringMap<unsigned> globalsVersioning;
 
@@ -106,6 +111,57 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
     return baseName + "." + std::to_string(recordNames[baseName]++);
   }
 
+  //
+  // Floating point specific helpers
+  // -------------------------------
+  //
+
+  /// Enable/Disable use of constrained floating point math. When enabled the
+  /// CreateF<op>() calls instead create constrained floating point intrinsic
+  /// calls. Fast math flags are unaffected by this setting.
+  void setIsFPConstrained(bool IsCon) {
+    if (IsCon)
+      llvm_unreachable("Constrained FP NYI");
+    isFPConstrained = IsCon;
+  }
+
+  /// Query for the use of constrained floating point math
+  bool getIsFPConstrained() {
+    if (isFPConstrained)
+      llvm_unreachable("Constrained FP NYI");
+    return isFPConstrained;
+  }
+
+  /// Set the exception handling to be used with constrained floating point
+  void setDefaultConstrainedExcept(cir::fp::ExceptionBehavior NewExcept) {
+#ifndef NDEBUG
+    std::optional<llvm::StringRef> ExceptStr =
+        cir::convertExceptionBehaviorToStr(NewExcept);
+    assert(ExceptStr && "Garbage strict exception behavior!");
+#endif
+    defaultConstrainedExcept = NewExcept;
+  }
+
+  /// Set the rounding mode handling to be used with constrained floating point
+  void setDefaultConstrainedRounding(llvm::RoundingMode NewRounding) {
+#ifndef NDEBUG
+    std::optional<llvm::StringRef> RoundingStr =
+        cir::convertRoundingModeToStr(NewRounding);
+    assert(RoundingStr && "Garbage strict rounding mode!");
+#endif
+    defaultConstrainedRounding = NewRounding;
+  }
+
+  /// Get the exception handling used with constrained floating point
+  cir::fp::ExceptionBehavior getDefaultConstrainedExcept() {
+    return defaultConstrainedExcept;
+  }
+
+  /// Get the rounding mode handling used with constrained floating point
+  llvm::RoundingMode getDefaultConstrainedRounding() {
+    return defaultConstrainedRounding;
+  }
+
   cir::LongDoubleType getLongDoubleTy(const llvm::fltSemantics &format) const {
     if (&format == &llvm::APFloat::IEEEdouble())
       return cir::LongDoubleType::get(getContext(), typeCache.doubleTy);
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
index f2d73720a9c2b..3f7a73115b886 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
@@ -19,6 +19,7 @@
 #include "clang/AST/Attr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/GlobalDecl.h"
+#include "clang/CIR/Dialect/IR/FPEnv.h"
 #include "clang/CIR/MissingFeatures.h"
 
 #include <cassert>
@@ -956,6 +957,22 @@ LValue CIRGenFunction::makeNaturalAlignAddrLValue(mlir::Value val,
   return makeAddrLValue(addr, ty, baseInfo);
 }
 
+// Map the LangOption for exception behavior into the corresponding enum in
+// the IR.
+static cir::fp::ExceptionBehavior
+toConstrainedExceptMd(LangOptions::FPExceptionModeKind kind) {
+  switch (kind) {
+  case LangOptions::FPE_Ignore:
+    return cir::fp::ebIgnore;
+  case LangOptions::FPE_MayTrap:
+    return cir::fp::ebMayTrap;
+  case LangOptions::FPE_Strict:
+    return cir::fp::ebStrict;
+  default:
+    llvm_unreachable("Unsupported FP Exception Behavior");
+  }
+}
+
 clang::QualType CIRGenFunction::buildFunctionArgList(clang::GlobalDecl gd,
                                                      FunctionArgList &args) {
   const auto *fd = cast<FunctionDecl>(gd.getDecl());
@@ -1119,6 +1136,59 @@ void CIRGenFunction::emitNullInitialization(mlir::Location loc, Address destPtr,
   builder.createStore(loc, zeroValue, destPtr);
 }
 
+CIRGenFunction::CIRGenFPOptionsRAII::CIRGenFPOptionsRAII(CIRGenFunction &cgf,
+                                                         const clang::Expr *e)
+    : cgf(cgf) {
+  ConstructorHelper(e->getFPFeaturesInEffect(cgf.getLangOpts()));
+}
+
+CIRGenFunction::CIRGenFPOptionsRAII::CIRGenFPOptionsRAII(CIRGenFunction &cgf,
+                                                         FPOptions fpFeatures)
+    : cgf(cgf) {
+  ConstructorHelper(fpFeatures);
+}
+
+void CIRGenFunction::CIRGenFPOptionsRAII::ConstructorHelper(
+    FPOptions fpFeatures) {
+  oldFPFeatures = cgf.curFPFeatures;
+  cgf.curFPFeatures = fpFeatures;
+
+  oldExcept = cgf.builder.getDefaultConstrainedExcept();
+  oldRounding =cgf.builder.getDefaultConstrainedRounding();
+
+  if (oldFPFeatures == fpFeatures)
+    return;
+
+  // TODO(cir): create guard to restore fast math configurations.
+  assert(!cir::MissingFeatures::fastMathGuard());
+
+  llvm::RoundingMode newRoundingBehavior = fpFeatures.getRoundingMode();
+  // TODO(cir): override rounding behaviour once FM configs are guarded.
+  auto newExceptionBehavior =
+      toConstrainedExceptMd(static_cast<LangOptions::FPExceptionModeKind>(
+          fpFeatures.getExceptionMode()));
+  // TODO(cir): override exception behaviour once FM configs are guarded.
+
+  // TODO(cir): override FP flags once FM configs are guarded.
+  assert(!cir::MissingFeatures::fastMathFlags());
+
+  assert((cgf.curFuncDecl == nullptr || cgf.builder.getIsFPConstrained() ||
+          isa<CXXConstructorDecl>(cgf.curFuncDecl) ||
+          isa<CXXDestructorDecl>(cgf.curFuncDecl) ||
+          (newExceptionBehavior == cir::fp::ebIgnore &&
+           newRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
+         "FPConstrained should be enabled on entire function");
+
+  // TODO(cir): mark CIR function with fast math attributes.
+  assert(!cir::MissingFeatures::fastMathFuncAttributes());
+}
+
+CIRGenFunction::CIRGenFPOptionsRAII::~CIRGenFPOptionsRAII() {
+  cgf.curFPFeatures = oldFPFeatures;
+  cgf.builder.setDefaultConstrainedExcept(oldExcept);
+  cgf.builder.setDefaultConstrainedRounding(oldRounding);
+}
+
 // TODO(cir): should be shared with LLVM codegen.
 bool CIRGenFunction::shouldNullCheckClassCastValue(const CastExpr *ce) {
   const Expr *e = ce->getSubExpr();
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h
index adcf4d56e3892..01a36fca6c272 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.h
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h
@@ -185,6 +185,21 @@ class CIRGenFunction : public CIRGenTypeCache {
   /// Sanitizers enabled for this function.
   clang::SanitizerSet sanOpts;
 
+  class CIRGenFPOptionsRAII {
+  public:
+    CIRGenFPOptionsRAII(CIRGenFunction &cgf, FPOptions FPFeatures);
+    CIRGenFPOptionsRAII(CIRGenFunction &cgf, const clang::Expr *E);
+    ~CIRGenFPOptionsRAII();
+
+  private:
+    void ConstructorHelper(clang::FPOptions FPFeatures);
+    CIRGenFunction &cgf;
+    clang::FPOptions oldFPFeatures;
+    cir::fp::ExceptionBehavior oldExcept;
+    llvm::RoundingMode oldRounding;
+  };
+  clang::FPOptions curFPFeatures;
+
   /// The symbol table maps a variable name to a value in the current scope.
   /// Entering a function creates a new scope, and the function arguments are
   /// added to the mapping. When the processing of a function is terminated,
diff --git a/clang/lib/CIR/Dialect/IR/CMakeLists.txt b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
index 98575941035f2..de3c7d7a1c3b9 100644
--- a/clang/lib/CIR/Dialect/IR/CMakeLists.txt
+++ b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
@@ -4,6 +4,7 @@ add_clang_library(MLIRCIR
   CIRMemorySlot.cpp
   CIRTypes.cpp
   CIRDataLayout.cpp
+  FPEnv.cpp
 
   DEPENDS
   MLIRCIROpsIncGen
diff --git a/clang/lib/CIR/Dialect/IR/FPEnv.cpp b/clang/lib/CIR/Dialect/IR/FPEnv.cpp
new file mode 100644
index 0000000000000..501268ce57f47
--- /dev/null
+++ b/clang/lib/CIR/Dialect/IR/FPEnv.cpp
@@ -0,0 +1,64 @@
+//===-- FPEnv.cpp ---- FP Environment -------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+/// @file
+/// This file contains the implementations of entities that describe floating
+/// point environment.
+//
+//===----------------------------------------------------------------------===//
+
+#include "clang/CIR/Dialect/IR/FPEnv.h"
+
+namespace cir {
+
+std::optional<llvm::StringRef>
+convertRoundingModeToStr(llvm::RoundingMode useRounding) {
+  std::optional<llvm::StringRef> roundingStr;
+  switch (useRounding) {
+  case llvm::RoundingMode::Dynamic:
+    roundingStr = "round.dynamic";
+    break;
+  case llvm::RoundingMode::NearestTiesToEven:
+    roundingStr = "round.tonearest";
+    break;
+  case llvm::RoundingMode::NearestTiesToAway:
+    roundingStr = "round.tonearestaway";
+    break;
+  case llvm::RoundingMode::TowardNegative:
+    roundingStr = "round.downward";
+    break;
+  case llvm::RoundingMode::TowardPositive:
+    roundingStr = "round.upward";
+    break;
+  case llvm::RoundingMode::TowardZero:
+    roundingStr = "round.towardZero";
+    break;
+  default:
+    break;
+  }
+  return roundingStr;
+}
+
+std::optional<llvm::StringRef>
+convertExceptionBehaviorToStr(fp::ExceptionBehavior useExcept) {
+  std::optional<llvm::StringRef> exceptStr;
+  switch (useExcept) {
+  case fp::ebStrict:
+    exceptStr = "fpexcept.strict";
+    break;
+  case fp::ebIgnore:
+    exceptStr = "fpexcept.ignore";
+    break;
+  case fp::ebMayTrap:
+    exceptStr = "fpexcept.maytrap";
+    break;
+  }
+  return exceptStr;
+}
+
+} // namespace cir
\ No newline at end of file

>From 1a0af4e5982b8116b6679c4dddbd0e865c0e21de Mon Sep 17 00:00:00 2001
From: Ayokunle Amodu <ayokunle321 at gmail.com>
Date: Sun, 1 Feb 2026 10:44:30 -0700
Subject: [PATCH 2/4] fix code format

---
 clang/include/clang/CIR/MissingFeatures.h | 2 +-
 clang/lib/CIR/CodeGen/CIRGenFunction.cpp  | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/CIR/MissingFeatures.h b/clang/include/clang/CIR/MissingFeatures.h
index c8e61fd217411..19cc7a88d1040 100644
--- a/clang/include/clang/CIR/MissingFeatures.h
+++ b/clang/include/clang/CIR/MissingFeatures.h
@@ -278,7 +278,7 @@ struct MissingFeatures {
   static bool emitNullabilityCheck() { return false; }
   static bool emitTypeCheck() { return false; }
   static bool emitTypeMetadataCodeForVCall() { return false; }
-  
+
   // Fast math.
   static bool fastMathGuard() { return false; }
   // Should be implemented with a moduleOp level attribute and directly
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
index 3f7a73115b886..e9e6ac74720f0 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
@@ -1154,7 +1154,7 @@ void CIRGenFunction::CIRGenFPOptionsRAII::ConstructorHelper(
   cgf.curFPFeatures = fpFeatures;
 
   oldExcept = cgf.builder.getDefaultConstrainedExcept();
-  oldRounding =cgf.builder.getDefaultConstrainedRounding();
+  oldRounding = cgf.builder.getDefaultConstrainedRounding();
 
   if (oldFPFeatures == fpFeatures)
     return;

>From fb54fe8bc40c0b12624f2d43294ed3a94eb408da Mon Sep 17 00:00:00 2001
From: Ayokunle Amodu <ayokunle321 at gmail.com>
Date: Sat, 14 Feb 2026 07:43:51 -0700
Subject: [PATCH 3/4] remove CIR FP env setup, share with llvm instead

---
 .../CIR/Dialect/Builder/CIRBaseBuilder.h      |  2 +-
 clang/lib/CIR/CodeGen/CIRGenBuilder.h         | 38 ++++-------
 clang/lib/CIR/CodeGen/CIRGenFunction.cpp      | 16 ++---
 clang/lib/CIR/CodeGen/CIRGenFunction.h        |  2 +-
 clang/lib/CIR/Dialect/IR/CMakeLists.txt       |  1 -
 clang/lib/CIR/Dialect/IR/FPEnv.cpp            | 64 -------------------
 6 files changed, 22 insertions(+), 101 deletions(-)
 delete mode 100644 clang/lib/CIR/Dialect/IR/FPEnv.cpp

diff --git a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
index 770a6337626c4..aad2e9f1d992f 100644
--- a/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
+++ b/clang/include/clang/CIR/Dialect/Builder/CIRBaseBuilder.h
@@ -14,9 +14,9 @@
 #include "clang/CIR/Dialect/IR/CIRAttrs.h"
 #include "clang/CIR/Dialect/IR/CIRDialect.h"
 #include "clang/CIR/Dialect/IR/CIRTypes.h"
-#include "clang/CIR/Dialect/IR/FPEnv.h"
 #include "clang/CIR/MissingFeatures.h"
 #include "llvm/ADT/STLForwardCompat.h"
+#include "llvm/IR/FPEnv.h"
 #include "llvm/Support/ErrorHandling.h"
 
 #include "mlir/IR/Builders.h"
diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
index 812d9b9c39acf..546605a11a19b 100644
--- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h
+++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h
@@ -16,20 +16,20 @@
 #include "mlir/IR/BuiltinAttributes.h"
 #include "mlir/Support/LLVM.h"
 #include "clang/CIR/Dialect/IR/CIRDataLayout.h"
-#include "clang/CIR/Dialect/IR/FPEnv.h"
 #include "clang/CIR/MissingFeatures.h"
 
 #include "clang/CIR/Dialect/Builder/CIRBaseBuilder.h"
 #include "clang/CIR/MissingFeatures.h"
 #include "llvm/ADT/APFloat.h"
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/IR/FPEnv.h"
 
 namespace clang::CIRGen {
 
 class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
   const CIRGenTypeCache &typeCache;
   bool isFPConstrained = false;
-  cir::fp::ExceptionBehavior defaultConstrainedExcept = cir::fp::ebStrict;
+  llvm::fp::ExceptionBehavior defaultConstrainedExcept = llvm::fp::ebStrict;
   llvm::RoundingMode defaultConstrainedRounding = llvm::RoundingMode::Dynamic;
 
   llvm::StringMap<unsigned> recordNames;
@@ -119,41 +119,27 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
   /// Enable/Disable use of constrained floating point math. When enabled the
   /// CreateF<op>() calls instead create constrained floating point intrinsic
   /// calls. Fast math flags are unaffected by this setting.
-  void setIsFPConstrained(bool IsCon) {
-    if (IsCon)
-      llvm_unreachable("Constrained FP NYI");
-    isFPConstrained = IsCon;
-  }
+  void setIsFPConstrained(bool isCon) { isFPConstrained = isCon; }
 
   /// Query for the use of constrained floating point math
-  bool getIsFPConstrained() {
-    if (isFPConstrained)
-      llvm_unreachable("Constrained FP NYI");
-    return isFPConstrained;
-  }
+  bool getIsFPConstrained() { return isFPConstrained; }
 
   /// Set the exception handling to be used with constrained floating point
-  void setDefaultConstrainedExcept(cir::fp::ExceptionBehavior NewExcept) {
-#ifndef NDEBUG
-    std::optional<llvm::StringRef> ExceptStr =
-        cir::convertExceptionBehaviorToStr(NewExcept);
-    assert(ExceptStr && "Garbage strict exception behavior!");
-#endif
-    defaultConstrainedExcept = NewExcept;
+  void setDefaultConstrainedExcept(llvm::fp::ExceptionBehavior newExcept) {
+    assert(llvm::convertExceptionBehaviorToStr(newExcept) &&
+           "Garbage strict exception behavior!");
+    defaultConstrainedExcept = newExcept;
   }
 
   /// Set the rounding mode handling to be used with constrained floating point
   void setDefaultConstrainedRounding(llvm::RoundingMode NewRounding) {
-#ifndef NDEBUG
-    std::optional<llvm::StringRef> RoundingStr =
-        cir::convertRoundingModeToStr(NewRounding);
-    assert(RoundingStr && "Garbage strict rounding mode!");
-#endif
+    assert(llvm::convertRoundingModeToStr(NewRounding) &&
+           "Garbage strict rounding mode!");
     defaultConstrainedRounding = NewRounding;
   }
 
   /// Get the exception handling used with constrained floating point
-  cir::fp::ExceptionBehavior getDefaultConstrainedExcept() {
+  llvm::fp::ExceptionBehavior getDefaultConstrainedExcept() {
     return defaultConstrainedExcept;
   }
 
@@ -751,4 +737,4 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy {
 
 } // namespace clang::CIRGen
 
-#endif
+#endif
\ No newline at end of file
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
index e9e6ac74720f0..5a48427bc2d6e 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.cpp
@@ -19,8 +19,8 @@
 #include "clang/AST/Attr.h"
 #include "clang/AST/ExprCXX.h"
 #include "clang/AST/GlobalDecl.h"
-#include "clang/CIR/Dialect/IR/FPEnv.h"
 #include "clang/CIR/MissingFeatures.h"
+#include "llvm/IR/FPEnv.h"
 
 #include <cassert>
 
@@ -959,17 +959,17 @@ LValue CIRGenFunction::makeNaturalAlignAddrLValue(mlir::Value val,
 
 // Map the LangOption for exception behavior into the corresponding enum in
 // the IR.
-static cir::fp::ExceptionBehavior
+static llvm::fp::ExceptionBehavior
 toConstrainedExceptMd(LangOptions::FPExceptionModeKind kind) {
   switch (kind) {
   case LangOptions::FPE_Ignore:
-    return cir::fp::ebIgnore;
+    return llvm::fp::ebIgnore;
   case LangOptions::FPE_MayTrap:
-    return cir::fp::ebMayTrap;
+    return llvm::fp::ebMayTrap;
   case LangOptions::FPE_Strict:
-    return cir::fp::ebStrict;
+    return llvm::fp::ebStrict;
   default:
-    llvm_unreachable("Unsupported FP Exception Behavior");
+    llvm_unreachable("unsupported FP exception behavior");
   }
 }
 
@@ -1164,7 +1164,7 @@ void CIRGenFunction::CIRGenFPOptionsRAII::ConstructorHelper(
 
   llvm::RoundingMode newRoundingBehavior = fpFeatures.getRoundingMode();
   // TODO(cir): override rounding behaviour once FM configs are guarded.
-  auto newExceptionBehavior =
+  llvm::fp::ExceptionBehavior newExceptionBehavior =
       toConstrainedExceptMd(static_cast<LangOptions::FPExceptionModeKind>(
           fpFeatures.getExceptionMode()));
   // TODO(cir): override exception behaviour once FM configs are guarded.
@@ -1175,7 +1175,7 @@ void CIRGenFunction::CIRGenFPOptionsRAII::ConstructorHelper(
   assert((cgf.curFuncDecl == nullptr || cgf.builder.getIsFPConstrained() ||
           isa<CXXConstructorDecl>(cgf.curFuncDecl) ||
           isa<CXXDestructorDecl>(cgf.curFuncDecl) ||
-          (newExceptionBehavior == cir::fp::ebIgnore &&
+          (newExceptionBehavior == llvm::fp::ebIgnore &&
            newRoundingBehavior == llvm::RoundingMode::NearestTiesToEven)) &&
          "FPConstrained should be enabled on entire function");
 
diff --git a/clang/lib/CIR/CodeGen/CIRGenFunction.h b/clang/lib/CIR/CodeGen/CIRGenFunction.h
index 01a36fca6c272..b13d0f018fce9 100644
--- a/clang/lib/CIR/CodeGen/CIRGenFunction.h
+++ b/clang/lib/CIR/CodeGen/CIRGenFunction.h
@@ -195,7 +195,7 @@ class CIRGenFunction : public CIRGenTypeCache {
     void ConstructorHelper(clang::FPOptions FPFeatures);
     CIRGenFunction &cgf;
     clang::FPOptions oldFPFeatures;
-    cir::fp::ExceptionBehavior oldExcept;
+    llvm::fp::ExceptionBehavior oldExcept;
     llvm::RoundingMode oldRounding;
   };
   clang::FPOptions curFPFeatures;
diff --git a/clang/lib/CIR/Dialect/IR/CMakeLists.txt b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
index de3c7d7a1c3b9..98575941035f2 100644
--- a/clang/lib/CIR/Dialect/IR/CMakeLists.txt
+++ b/clang/lib/CIR/Dialect/IR/CMakeLists.txt
@@ -4,7 +4,6 @@ add_clang_library(MLIRCIR
   CIRMemorySlot.cpp
   CIRTypes.cpp
   CIRDataLayout.cpp
-  FPEnv.cpp
 
   DEPENDS
   MLIRCIROpsIncGen
diff --git a/clang/lib/CIR/Dialect/IR/FPEnv.cpp b/clang/lib/CIR/Dialect/IR/FPEnv.cpp
deleted file mode 100644
index 501268ce57f47..0000000000000
--- a/clang/lib/CIR/Dialect/IR/FPEnv.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-//===-- FPEnv.cpp ---- FP Environment -------------------------------------===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-/// @file
-/// This file contains the implementations of entities that describe floating
-/// point environment.
-//
-//===----------------------------------------------------------------------===//
-
-#include "clang/CIR/Dialect/IR/FPEnv.h"
-
-namespace cir {
-
-std::optional<llvm::StringRef>
-convertRoundingModeToStr(llvm::RoundingMode useRounding) {
-  std::optional<llvm::StringRef> roundingStr;
-  switch (useRounding) {
-  case llvm::RoundingMode::Dynamic:
-    roundingStr = "round.dynamic";
-    break;
-  case llvm::RoundingMode::NearestTiesToEven:
-    roundingStr = "round.tonearest";
-    break;
-  case llvm::RoundingMode::NearestTiesToAway:
-    roundingStr = "round.tonearestaway";
-    break;
-  case llvm::RoundingMode::TowardNegative:
-    roundingStr = "round.downward";
-    break;
-  case llvm::RoundingMode::TowardPositive:
-    roundingStr = "round.upward";
-    break;
-  case llvm::RoundingMode::TowardZero:
-    roundingStr = "round.towardZero";
-    break;
-  default:
-    break;
-  }
-  return roundingStr;
-}
-
-std::optional<llvm::StringRef>
-convertExceptionBehaviorToStr(fp::ExceptionBehavior useExcept) {
-  std::optional<llvm::StringRef> exceptStr;
-  switch (useExcept) {
-  case fp::ebStrict:
-    exceptStr = "fpexcept.strict";
-    break;
-  case fp::ebIgnore:
-    exceptStr = "fpexcept.ignore";
-    break;
-  case fp::ebMayTrap:
-    exceptStr = "fpexcept.maytrap";
-    break;
-  }
-  return exceptStr;
-}
-
-} // namespace cir
\ No newline at end of file

>From 4e105ffbc9242aaa3406d8a530937a9014a842a0 Mon Sep 17 00:00:00 2001
From: Ayokunle Amodu <ayokunle321 at gmail.com>
Date: Sat, 14 Feb 2026 07:58:14 -0700
Subject: [PATCH 4/4] delete CIR FP env header file

---
 clang/include/clang/CIR/Dialect/IR/FPEnv.h | 50 ----------------------
 1 file changed, 50 deletions(-)
 delete mode 100644 clang/include/clang/CIR/Dialect/IR/FPEnv.h

diff --git a/clang/include/clang/CIR/Dialect/IR/FPEnv.h b/clang/include/clang/CIR/Dialect/IR/FPEnv.h
deleted file mode 100644
index aceba9ee57d05..0000000000000
--- a/clang/include/clang/CIR/Dialect/IR/FPEnv.h
+++ /dev/null
@@ -1,50 +0,0 @@
-//===- FPEnv.h ---- FP Environment ------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-/// @file
-/// This file contains the declarations of entities that describe floating
-/// point environment and related functions.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef CLANG_CIR_DIALECT_IR_FPENV_H
-#define CLANG_CIR_DIALECT_IR_FPENV_H
-
-#include "llvm/ADT/FloatingPointMode.h"
-
-#include <optional>
-
-namespace cir {
-
-namespace fp {
-
-/// Exception behavior used for floating point operations.
-///
-/// Each of these values corresponds to some LLVMIR metadata argument value of a
-/// constrained floating point intrinsic. See the LLVM Language Reference Manual
-/// for details.
-enum ExceptionBehavior : uint8_t {
-  ebIgnore,  ///< This corresponds to "fpexcept.ignore".
-  ebMayTrap, ///< This corresponds to "fpexcept.maytrap".
-  ebStrict,  ///< This corresponds to "fpexcept.strict".
-};
-
-} // namespace fp
-
-/// For any RoundingMode enumerator, returns a string valid as input in
-/// constrained intrinsic rounding mode metadata.
-std::optional<llvm::StringRef> convertRoundingModeToStr(llvm::RoundingMode);
-
-/// For any ExceptionBehavior enumerator, returns a string valid as input in
-/// constrained intrinsic exception behavior metadata.
-std::optional<llvm::StringRef>
-    convertExceptionBehaviorToStr(fp::ExceptionBehavior);
-
-} // namespace cir
-
-#endif



More information about the cfe-commits mailing list