Skip to content

Commit 756da17

Browse files
authored
[CIR] Implement codegen for glvalue OpaqueValueExprs (#1587)
Co-authored-by: Morris Hafner <[email protected]>
1 parent c5f0f97 commit 756da17

File tree

2 files changed

+27
-1
lines changed

2 files changed

+27
-1
lines changed

clang/lib/CIR/CodeGen/CIRGenExprScalar.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,8 @@ class ScalarExprEmitter : public StmtVisitor<ScalarExprEmitter, mlir::Value> {
237237
}
238238
mlir::Value VisitOpaqueValueExpr(OpaqueValueExpr *E) {
239239
if (E->isGLValue())
240-
llvm_unreachable("NYI");
240+
return emitLoadOfLValue(CGF.getOrCreateOpaqueLValueMapping(E),
241+
E->getExprLoc());
241242

242243
// Otherwise, assume the mapping is the scalar directly.
243244
return CGF.getOrCreateOpaqueRValueMapping(E).getScalarVal();

clang/test/CIR/CodeGen/ternary.cpp

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,28 @@ int foo(int a, int b) {
7070
// CHECK: }) : (!cir.bool) -> !s32i
7171
// CHECK: [[RES_CAST:%.*]] = cir.cast(int_to_bool, [[RES]] : !s32i), !cir.bool
7272
// CHECK: cir.if [[RES_CAST]]
73+
74+
void maybe_has_side_effects();
75+
76+
bool func(bool a, bool b) {
77+
return (maybe_has_side_effects(), a) ?: b;
78+
}
79+
80+
// CHECK: cir.func @_Z4funcbb([[ARG_A:%.*]]: !cir.bool {{.*}}, [[ARG_B:%.*]]: !cir.bool {{.*}}
81+
// CHECK: [[ALLOC_A:%.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["a", init]
82+
// CHECK: [[ALLOC_B:%.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["b", init]
83+
// CHECK: [[ALLOC_RET:%.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["__retval"]
84+
// CHECK: cir.store [[ARG_A]], [[ALLOC_A]] : !cir.bool, !cir.ptr<!cir.bool>
85+
// CHECK: cir.store [[ARG_B]], [[ALLOC_B]] : !cir.bool, !cir.ptr<!cir.bool>
86+
// CHECK: cir.call @_Z22maybe_has_side_effectsv() : () -> ()
87+
// CHECK: [[A0:%.*]] = cir.load [[ALLOC_A]] : !cir.ptr<!cir.bool>, !cir.bool
88+
// CHECK: [[RES:%.*]] = cir.ternary([[A0]], true {
89+
// CHECK: [[A1:%.*]] = cir.load [[ALLOC_A]] : !cir.ptr<!cir.bool>, !cir.bool
90+
// CHECK: cir.yield [[A1]] : !cir.bool
91+
// CHECK: }, false {
92+
// CHECK: [[B0:%.*]] = cir.load [[ALLOC_B]] : !cir.ptr<!cir.bool>, !cir.bool
93+
// CHECK: cir.yield [[B0]] : !cir.bool
94+
// CHECK: }) : (!cir.bool) -> !cir.bool
95+
// CHECK: cir.store [[RES]], [[ALLOC_RET]] : !cir.bool, !cir.ptr<!cir.bool>
96+
// CHECK: [[R:%.*]] = cir.load [[ALLOC_RET]] : !cir.ptr<!cir.bool>, !cir.bool
97+
// CHECK: cir.return [[R]] : !cir.bool

0 commit comments

Comments
 (0)