diff --git a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp index 825024daab8a..4b56fe53c1a0 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp @@ -52,7 +52,12 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID, Expr::EvalResult Result; if (E->isPRValue() && E->EvaluateAsRValue(Result, CGM.getASTContext()) && !Result.hasSideEffects()) { - llvm_unreachable("NYI"); + if (Result.Val.isInt()) { + return RValue::get(builder.getConstInt(getLoc(E->getSourceRange()), + Result.Val.getInt())); + } + if (Result.Val.isFloat()) + llvm_unreachable("NYI"); } // If current long-double semantics is IEEE 128-bit, replace math builtins diff --git a/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp b/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp new file mode 100644 index 000000000000..ad89dcd25484 --- /dev/null +++ b/clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp @@ -0,0 +1,11 @@ +// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o - | FileCheck %s + +auto func() { + return __builtin_strcmp("", ""); + // CHECK: cir.func @_Z4funcv() -> !s32i extra( {inline = #cir.inline, optnone = #cir.optnone} ) { + // CHECK-NEXT: %0 = cir.alloca !s32i, cir.ptr , ["__retval"] {alignment = 4 : i64} loc(#loc2) + // CHECK-NEXT: %1 = cir.const(#cir.int<0> : !s32i) : !s32i loc(#loc7) + // CHECK-NEXT: cir.store %1, %0 : !s32i, cir.ptr loc(#loc8) + // CHECK-NEXT: %2 = cir.load %0 : cir.ptr , !s32i loc(#loc8) + // CHECK-NEXT: cir.return %2 : !s32i loc(#loc8) +}