Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
3 changes: 2 additions & 1 deletion clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -237,7 +237,8 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
}
mlir::Value VisitOpaqueValueExpr(OpaqueValueExpr *E) {
if (E->isGLValue())
llvm_unreachable("NYI");
return emitLoadOfLValue(CGF.getOrCreateOpaqueLValueMapping(E),
E->getExprLoc());

// Otherwise, assume the mapping is the scalar directly.
return CGF.getOrCreateOpaqueRValueMapping(E).getScalarVal();
Expand Down
25 changes: 25 additions & 0 deletions clang/test/CIR/CodeGen/ternary.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,28 @@ int foo(int a, int b) {
// CHECK: }) : (!cir.bool) -> !s32i
// CHECK: [[RES_CAST:%.*]] = cir.cast(int_to_bool, [[RES]] : !s32i), !cir.bool
// CHECK: cir.if [[RES_CAST]]

void maybe_has_side_effects();

bool func(bool a, bool b) {
return (maybe_has_side_effects(), a) ?: b;
}

// CHECK: cir.func @_Z4funcbb(%arg0: !cir.bool
// CHECK: cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a", init]
// CHECK: cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
// CHECK: cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["__retval"]
// CHECK: cir.store %arg0, %0 : !cir.bool, !cir.ptr<!cir.bool>
// CHECK: cir.store %arg1, %1 : !cir.bool, !cir.ptr<!cir.bool>
// CHECK: cir.call @_Z22maybe_has_side_effectsv() : () -> ()
// CHECK: [[A0:%.*]] = cir.load %0 : !cir.ptr<!cir.bool>, !cir.bool
// CHECK: [[RES:%.*]] = cir.ternary([[A0]], true {
// CHECK: [[A1:%.*]] = cir.load %0 : !cir.ptr<!cir.bool>, !cir.bool
// CHECK: cir.yield [[A1]] : !cir.bool
// CHECK: }, false {
// CHECK: [[B0:%.*]] = cir.load %1 : !cir.ptr<!cir.bool>, !cir.bool
// CHECK: cir.yield [[B0]] : !cir.bool
// CHECK: }) : (!cir.bool) -> !cir.bool
// CHECK: cir.store [[RES]], %2 : !cir.bool, !cir.ptr<!cir.bool>
// CHECK: [[R:%.*]] = cir.load %2 : !cir.ptr<!cir.bool>, !cir.bool
// CHECK: cir.return [[R]] : !cir.bool
Loading