@@ -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