Skip to content

Commit 176c0da

Browse files
philnik777lanza
authored andcommitted
[CIR][CIRGen] Implement constant evaluation for integral builtins (#381)
1 parent 0f7f250 commit 176c0da

File tree

2 files changed

+17
-1
lines changed

2 files changed

+17
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenBuiltin.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,12 @@ RValue CIRGenFunction::buildBuiltinExpr(const GlobalDecl GD, unsigned BuiltinID,
5252
Expr::EvalResult Result;
5353
if (E->isPRValue() && E->EvaluateAsRValue(Result, CGM.getASTContext()) &&
5454
!Result.hasSideEffects()) {
55-
llvm_unreachable("NYI");
55+
if (Result.Val.isInt()) {
56+
return RValue::get(builder.getConstInt(getLoc(E->getSourceRange()),
57+
Result.Val.getInt()));
58+
}
59+
if (Result.Val.isFloat())
60+
llvm_unreachable("NYI");
5661
}
5762

5863
// If current long-double semantics is IEEE 128-bit, replace math builtins
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// RUN: %clang_cc1 -std=c++17 -triple x86_64-unknown-linux-gnu -fclangir-enable -emit-cir %s -o - | FileCheck %s
2+
3+
auto func() {
4+
return __builtin_strcmp("", "");
5+
// CHECK: cir.func @_Z4funcv() -> !s32i extra( {inline = #cir.inline<no>, optnone = #cir.optnone} ) {
6+
// CHECK-NEXT: %0 = cir.alloca !s32i, cir.ptr <!s32i>, ["__retval"] {alignment = 4 : i64} loc(#loc2)
7+
// CHECK-NEXT: %1 = cir.const(#cir.int<0> : !s32i) : !s32i loc(#loc7)
8+
// CHECK-NEXT: cir.store %1, %0 : !s32i, cir.ptr <!s32i> loc(#loc8)
9+
// CHECK-NEXT: %2 = cir.load %0 : cir.ptr <!s32i>, !s32i loc(#loc8)
10+
// CHECK-NEXT: cir.return %2 : !s32i loc(#loc8)
11+
}

0 commit comments

Comments
 (0)