Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 5 additions & 1 deletion clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -772,7 +772,11 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
mlir::Value VisitBlockExpr(const BlockExpr *E) { llvm_unreachable("NYI"); }
mlir::Value
VisitAbstractConditionalOperator(const AbstractConditionalOperator *E);
mlir::Value VisitChooseExpr(ChooseExpr *E) { llvm_unreachable("NYI"); }

mlir::Value VisitChooseExpr(ChooseExpr *E) {
return Visit(E->getChosenSubExpr());
}

mlir::Value VisitVAArgExpr(VAArgExpr *VE);
mlir::Value VisitObjCStringLiteral(const ObjCStringLiteral *E) {
llvm_unreachable("NYI");
Expand Down
34 changes: 28 additions & 6 deletions clang/test/CIR/CodeGen/builtin-constant-evaluated.cpp
Original file line number Diff line number Diff line change
@@ -1,12 +1,34 @@
// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir
// RUN: FileCheck %s --check-prefix=CIR --input-file=%t.cir

auto func() {
auto func() -> int {
return __builtin_strcmp("", "");
// CIR: cir.func dso_local @_Z4funcv()
// CIR-NEXT: %0 = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
// CIR-NEXT: %1 = cir.const #cir.int<0> : !s32i
// CIR-NEXT: cir.store %1, %0 : !s32i, !cir.ptr<!s32i>
// CIR-NEXT: %2 = cir.load{{.*}} %0 : !cir.ptr<!s32i>, !s32i
// CIR-NEXT: cir.return %2 : !s32i
// CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"] {alignment = 4 : i64}
// CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<0> : !s32i
// CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr<!s32i>
// CIR-NEXT: %[[TMP:.*]] = cir.load{{.*}} %0 : !cir.ptr<!s32i>, !s32i
// CIR-NEXT: cir.return %[[TMP]] : !s32i
}

auto func2() -> int {
return __builtin_choose_expr(true, 1, 2);

// CIR: cir.func dso_local @_Z5func2v()
// CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
// CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<1> : !s32i
// CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr<!s32i>
// CIR-NEXT: %[[TMP:.*]] = cir.load %[[RET_VAL]] : !cir.ptr<!s32i>, !s32i
// CIR-NEXT: cir.return %[[TMP]] : !s32i
}

auto func3() -> int {
return __builtin_choose_expr(false, 1, 2);

// CIR: cir.func dso_local @_Z5func3v()
// CIR-NEXT: %[[RET_VAL:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]
// CIR-NEXT: %[[VAL:.*]] = cir.const #cir.int<2> : !s32i
// CIR-NEXT: cir.store %[[VAL]], %[[RET_VAL]] : !s32i, !cir.ptr<!s32i>
// CIR-NEXT: %[[TMP:.*]] = cir.load %[[RET_VAL]] : !cir.ptr<!s32i>, !s32i
// CIR-NEXT: cir.return %[[TMP]] : !s32i
}
Loading