[clang] [CIR][CodeGen] Upstream support for `__builtin_isinf_sign` (PR #183977)

Andy Kaylor via cfe-commits cfe-commits at lists.llvm.org
Mon Mar 2 14:46:32 PST 2026


================
@@ -1541,7 +1548,23 @@ RValue CIRGenFunction::emitBuiltinExpr(const GlobalDecl &gd, unsigned builtinID,
   case Builtin::BI__builtin_masked_store:
   case Builtin::BI__builtin_masked_compress_store:
   case Builtin::BI__builtin_masked_scatter:
-  case Builtin::BI__builtin_isinf_sign:
+    return errorBuiltinNYI(*this, e, builtinID);
+  case Builtin::BI__builtin_isinf_sign: {
+    CIRGenFunction::CIRGenFPOptionsRAII FPOptsRAII(*this, e);
+    mlir::Location loc = getLoc(e->getBeginLoc());
+    mlir::Value arg = emitScalarExpr(e->getArg(0));
+    mlir::Value absArg = cir::FAbsOp::create(builder, loc, arg.getType(), arg);
+    mlir::Value isInf =
+        builder.createIsFPClass(loc, absArg, cir::FPClassTest::Infinity);
+    mlir::Value isNeg = emitSignBit(loc, *this, arg);
+    auto intTy = convertType(e->getType());
+    auto zero = builder.getNullValue(intTy, loc);
+    auto one = builder.getConstant(loc, cir::IntAttr::get(intTy, 1));
+    auto negativeOne = builder.getConstant(loc, cir::IntAttr::get(intTy, -1));
+    auto signResult = builder.createSelect(loc, isNeg, negativeOne, one);
+    auto result = builder.createSelect(loc, isInf, signResult, zero);
----------------
andykaylor wrote:

Don't use auto for any of these. Many are guessable from the code, but not with certainty.

https://github.com/llvm/llvm-project/pull/183977


More information about the cfe-commits mailing list