359 lines · cpp
1// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o %t.cir2// RUN: FileCheck --check-prefix=CIR --input-file=%t.cir %s3// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -fclangir -emit-llvm %s -o %t-cir.ll4// RUN: FileCheck --check-prefix=LLVM --input-file=%t-cir.ll %s5// RUN: %clang_cc1 -triple x86_64-unknown-linux-gnu -emit-llvm %s -o %t.ll6// RUN: FileCheck --input-file=%t.ll %s --check-prefix=OGCG7 8int x(int y) {9 return y > 0 ? 3 : 5;10}11 12// CIR-LABEL: cir.func{{.*}} @_Z1xi(13// CIR-SAME: %[[ARG0:.*]]: !s32i {{.*}}) -> !s32i{{.*}}{14// CIR: [[Y:%.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["y", init]15// CIR: [[RETVAL:%.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]16// CIR: cir.store %[[ARG0]], [[Y]] : !s32i, !cir.ptr<!s32i>17// CIR: [[YVAL:%.+]] = cir.load{{.*}} [[Y]] : !cir.ptr<!s32i>, !s32i18// CIR: [[ZERO:%.+]] = cir.const #cir.int<0> : !s32i19// CIR: [[CMP:%.+]] = cir.cmp(gt, [[YVAL]], [[ZERO]]) : !s32i, !cir.bool20// CIR: [[THREE:%.+]] = cir.const #cir.int<3> : !s32i21// CIR: [[FIVE:%.+]] = cir.const #cir.int<5> : !s32i22// CIR: [[SELECT_RES:%.+]] = cir.select if [[CMP]] then [[THREE]] else [[FIVE]] : (!cir.bool, !s32i, !s32i) -> !s32i23// CIR: cir.store [[SELECT_RES]], [[RETVAL]] : !s32i, !cir.ptr<!s32i>24// CIR: [[RETVAL_VAL:%.+]] = cir.load [[RETVAL]] : !cir.ptr<!s32i>, !s32i25// CIR: cir.return [[RETVAL_VAL]] : !s32i26 27// LLVM-LABEL: define{{.*}} i32 @_Z1xi(28// LLVM-SAME: i32 %[[ARG0:.+]])29// LLVM: %[[Y:.*]] = alloca i3230// LLVM: %[[RETVAL:.*]] = alloca i3231// LLVM: store i32 %[[ARG0]], ptr %[[Y]]32// LLVM: %[[YVAL:.*]] = load i32, ptr %[[Y]]33// LLVM: %[[CMP:.*]] = icmp sgt i32 %[[YVAL]], 034// LLVM: %[[SELECT:.*]] = select i1 %[[CMP]], i32 3, i32 535// LLVM: store i32 %[[SELECT]], ptr %[[RETVAL]]36// LLVM: %[[RESULT:.*]] = load i32, ptr %[[RETVAL]]37// LLVM: ret i32 %[[RESULT]]38 39// OGCG-LABEL: define{{.*}} i32 @_Z1xi(40// OGCG-SAME: i32 {{.*}} %[[ARG0:.+]])41// OGCG: %[[Y:.*]] = alloca i3242// OGCG: store i32 %[[ARG0]], ptr %[[Y]]43// OGCG: %[[YVAL:.*]] = load i32, ptr %[[Y]]44// OGCG: %[[CMP:.*]] = icmp sgt i32 %[[YVAL]], 045// OGCG: %[[SELECT:.*]] = select i1 %[[CMP]], i32 3, i32 546// OGCG: ret i32 %[[SELECT]]47 48int foo(int a, int b) {49 if (a < b ? 0 : a)50 return -1;51 return 0;52}53 54// CIR-LABEL: cir.func{{.*}} @_Z3fooii(55// CIR-SAME: %[[ARG0:.*]]: !s32i {{.*}}, %[[ARG1:.*]]: !s32i {{.*}}) -> !s32i{{.*}}{56// CIR: [[A:%.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]57// CIR: [[B:%.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]58// CIR: [[RETVAL:%.+]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["__retval"]59// CIR: cir.store %[[ARG0]], [[A]] : !s32i, !cir.ptr<!s32i>60// CIR: cir.store %[[ARG1]], [[B]] : !s32i, !cir.ptr<!s32i>61// CIR: cir.scope {62// CIR: [[ALOAD:%.+]] = cir.load{{.*}} [[A]] : !cir.ptr<!s32i>, !s32i63// CIR: [[BLOAD:%.+]] = cir.load{{.*}} [[B]] : !cir.ptr<!s32i>, !s32i64// CIR: [[CMP:%.+]] = cir.cmp(lt, [[ALOAD]], [[BLOAD]]) : !s32i, !cir.bool65// CIR: [[TERNARY_RES:%.+]] = cir.ternary([[CMP]], true {66// CIR: [[ZERO:%.+]] = cir.const #cir.int<0> : !s32i67// CIR: cir.yield [[ZERO]] : !s32i68// CIR: }, false {69// CIR: [[ALOAD2:%.+]] = cir.load{{.*}} [[A]] : !cir.ptr<!s32i>, !s32i70// CIR: cir.yield [[ALOAD2]] : !s32i71// CIR: }) : (!cir.bool) -> !s32i72// CIR: [[CAST:%.+]] = cir.cast int_to_bool [[TERNARY_RES]] : !s32i -> !cir.bool73// CIR: cir.if [[CAST]] {74// CIR: [[ONE:%.+]] = cir.const #cir.int<1> : !s32i75// CIR: [[MINUS_ONE:%.+]] = cir.unary(minus, [[ONE]]) nsw : !s32i, !s32i76// CIR: cir.store [[MINUS_ONE]], [[RETVAL]] : !s32i, !cir.ptr<!s32i>77// CIR: [[RETVAL_VAL:%.+]] = cir.load [[RETVAL]] : !cir.ptr<!s32i>, !s32i78// CIR: cir.return [[RETVAL_VAL]] : !s32i79// CIR: }80// CIR: }81// CIR: [[ZERO2:%.+]] = cir.const #cir.int<0> : !s32i82// CIR: cir.store [[ZERO2]], [[RETVAL]] : !s32i, !cir.ptr<!s32i>83// CIR: [[RETVAL_VAL2:%.+]] = cir.load [[RETVAL]] : !cir.ptr<!s32i>, !s32i84// CIR: cir.return [[RETVAL_VAL2]] : !s32i85 86// LLVM-LABEL: define{{.*}} i32 @_Z3fooii(87// LLVM-SAME: i32 %[[ARG0:.*]], i32 %[[ARG1:.*]])88// LLVM: %[[A:.*]] = alloca i3289// LLVM: %[[B:.*]] = alloca i3290// LLVM: %[[RETVAL:.*]] = alloca i3291// LLVM: store i32 %[[ARG0]], ptr %[[A]]92// LLVM: store i32 %[[ARG1]], ptr %[[B]]93// LLVM: br label %[[ENTRY_BB:.*]]94// LLVM: [[ENTRY_BB]]:95// LLVM: %[[AVAL:.*]] = load i32, ptr %[[A]]96// LLVM: %[[BVAL:.*]] = load i32, ptr %[[B]]97// LLVM: %[[CMP:.*]] = icmp slt i32 %[[AVAL]], %[[BVAL]]98// LLVM: br i1 %[[CMP]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]99// LLVM: [[TRUE_BB]]:100// LLVM: br label %[[MERGE_BB:.*]]101// LLVM: [[FALSE_BB]]:102// LLVM: %[[AVAL2:.*]] = load i32, ptr %[[A]]103// LLVM: br label %[[MERGE_BB]]104// LLVM: [[MERGE_BB]]:105// LLVM: %[[PHI:.*]] = phi i32 [ %[[AVAL2]], %[[FALSE_BB]] ], [ 0, %[[TRUE_BB]] ]106// LLVM: %[[COND:.*]] = icmp ne i32 %[[PHI]], 0107// LLVM: br i1 %[[COND]], label %[[RETURN_MINUS_ONE:.*]], label %[[CONT_BB:.*]]108// LLVM: [[RETURN_MINUS_ONE]]:109// LLVM: store i32 -1, ptr %[[RETVAL]]110// LLVM: %[[RET1:.*]] = load i32, ptr %[[RETVAL]]111// LLVM: ret i32 %[[RET1]]112// LLVM: [[CONT_BB]]:113// LLVM: br label %[[RETURN_ZERO:.*]]114// LLVM: [[RETURN_ZERO]]:115// LLVM: store i32 0, ptr %[[RETVAL]]116// LLVM: %[[RET2:.*]] = load i32, ptr %[[RETVAL]]117// LLVM: ret i32 %[[RET2]]118 119// OGCG-LABEL: define{{.*}} i32 @_Z3fooii(120// OGCG-SAME: i32 {{.*}} %[[ARG0:.*]], i32 {{.*}} %[[ARG1:.*]])121// OGCG: %[[RETVAL:.*]] = alloca i32122// OGCG: %[[A:.*]] = alloca i32123// OGCG: %[[B:.*]] = alloca i32124// OGCG: store i32 %[[ARG0]], ptr %[[A]]125// OGCG: store i32 %[[ARG1]], ptr %[[B]]126// OGCG: %[[AVAL:.*]] = load i32, ptr %[[A]]127// OGCG: %[[BVAL:.*]] = load i32, ptr %[[B]]128// OGCG: %[[CMP:.*]] = icmp slt i32 %[[AVAL]], %[[BVAL]]129// OGCG: br i1 %[[CMP]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]130// OGCG: [[TRUE_BB]]:131// OGCG: br label %[[MERGE_BB:.*]]132// OGCG: [[FALSE_BB]]:133// OGCG: %[[AVAL2:.*]] = load i32, ptr %[[A]]134// OGCG: br label %[[MERGE_BB]]135// OGCG: [[MERGE_BB]]:136// OGCG: %[[PHI:.*]] = phi i32 [ 0, %[[TRUE_BB]] ], [ %[[AVAL2]], %[[FALSE_BB]] ]137// OGCG: %[[COND:.*]] = icmp ne i32 %[[PHI]], 0138// OGCG: br i1 %[[COND]], label %[[RETURN_MINUS_ONE:.*]], label %[[RETURN_ZERO:.*]]139// OGCG: [[RETURN_MINUS_ONE]]:140// OGCG: store i32 -1, ptr %[[RETVAL]]141// OGCG: br label %[[RETURN:.+]]142// OGCG: [[RETURN_ZERO]]:143// OGCG: store i32 0, ptr %[[RETVAL]]144// OGCG: br label %[[RETURN]]145// OGCG: [[RETURN]]:146// OGCG: %[[RET2:.*]] = load i32, ptr %[[RETVAL]]147// OGCG: ret i32 %[[RET2]]148 149void test_cond_lvalue_assign(bool flag) {150 int a = 1;151 int b = 2;152 (flag ? a : b) = 42;153}154 155// CIR-LABEL: cir.func{{.*}} @_Z23test_cond_lvalue_assignb(156// CIR: %[[FLAG:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["flag", init]157// CIR: %[[A:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]158// CIR: %[[B:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]159// CIR: %[[FLAG_VAL:.*]] = cir.load{{.*}} %[[FLAG]]160// CIR: %[[TERNARY_PTR:.*]] = cir.ternary(%[[FLAG_VAL]], true {161// CIR: cir.yield %[[A]] : !cir.ptr<!s32i>162// CIR: }, false {163// CIR: cir.yield %[[B]] : !cir.ptr<!s32i>164// CIR: }) : (!cir.bool) -> !cir.ptr<!s32i>165// CIR: cir.store{{.*}} %{{.*}}, %[[TERNARY_PTR]] : !s32i, !cir.ptr<!s32i>166 167// LLVM-LABEL: define{{.*}} void @_Z23test_cond_lvalue_assignb(168// LLVM: %[[FLAG:.*]] = alloca i8169// LLVM: %[[A:.*]] = alloca i32170// LLVM: %[[B:.*]] = alloca i32171// LLVM: %[[FLAG_VAL:.*]] = load i8, ptr %[[FLAG]]172// LLVM: %[[COND:.*]] = trunc i8 %[[FLAG_VAL]] to i1173// LLVM: br i1 %[[COND]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]174// LLVM: [[TRUE_BB]]:175// LLVM: br label %[[MERGE_BB:.*]]176// LLVM: [[FALSE_BB]]:177// LLVM: br label %[[MERGE_BB]]178// LLVM: [[MERGE_BB]]:179// LLVM: %[[PHI_PTR:.*]] = phi ptr [ %[[B]], %[[FALSE_BB]] ], [ %[[A]], %[[TRUE_BB]] ]180// LLVM: br label %[[CONT_BB:.*]]181// LLVM: [[CONT_BB]]:182// LLVM: store i32 42, ptr %[[PHI_PTR]]183 184// OGCG-LABEL: define{{.*}} void @_Z23test_cond_lvalue_assignb(185// OGCG: %[[FLAG:.*]] = alloca i8186// OGCG: %[[A:.*]] = alloca i32187// OGCG: %[[B:.*]] = alloca i32188// OGCG: %[[FLAG_VAL:.*]] = load i8, ptr %[[FLAG]]189// OGCG: %[[COND:.*]] = trunc i8 %[[FLAG_VAL]] to i1190// OGCG: br i1 %[[COND]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]191// OGCG: [[TRUE_BB]]:192// OGCG: br label %[[MERGE_BB:.*]]193// OGCG: [[FALSE_BB]]:194// OGCG: br label %[[MERGE_BB]]195// OGCG: [[MERGE_BB]]:196// OGCG: %[[PHI_PTR:.*]] = phi ptr [ %[[A]], %[[TRUE_BB]] ], [ %[[B]], %[[FALSE_BB]] ]197// OGCG: store i32 42, ptr %[[PHI_PTR]]198 199int& test_cond_lvalue_ref(bool cond, int x, int y) {200 return cond ? x : y;201}202 203// CIR-LABEL: cir.func{{.*}} @_Z20test_cond_lvalue_refbii(204// CIR: %[[COND:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["cond", init]205// CIR: %[[X:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["x", init]206// CIR: %[[Y:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["y", init]207// CIR: %[[COND_VAL:.*]] = cir.load{{.*}} %[[COND]]208// CIR: %[[REF_PTR:.*]] = cir.ternary(%[[COND_VAL]], true {209// CIR: cir.yield %[[X]] : !cir.ptr<!s32i>210// CIR: }, false {211// CIR: cir.yield %[[Y]] : !cir.ptr<!s32i>212// CIR: }) : (!cir.bool) -> !cir.ptr<!s32i>213// CIR: cir.store %[[REF_PTR]]214// CIR: %[[RET_VAL:.*]] = cir.load215// CIR: cir.return %[[RET_VAL]] : !cir.ptr<!s32i>216 217// LLVM-LABEL: define{{.*}} ptr @_Z20test_cond_lvalue_refbii(218// LLVM: %[[COND:.*]] = alloca i8219// LLVM: %[[X:.*]] = alloca i32220// LLVM: %[[Y:.*]] = alloca i32221// LLVM: %[[COND_VAL:.*]] = load i8, ptr %[[COND]]222// LLVM: %[[BOOL:.*]] = trunc i8 %[[COND_VAL]] to i1223// LLVM: br i1 %[[BOOL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]224// LLVM: [[TRUE_BB]]:225// LLVM: br label %[[MERGE_BB:.*]]226// LLVM: [[FALSE_BB]]:227// LLVM: br label %[[MERGE_BB]]228// LLVM: [[MERGE_BB]]:229// LLVM: %[[PHI:.*]] = phi ptr [ %[[Y]], %[[FALSE_BB]] ], [ %[[X]], %[[TRUE_BB]] ]230// LLVM: br label %[[CONT:.*]]231// LLVM: [[CONT]]:232// LLVM: store ptr %[[PHI]]233// LLVM: %[[RET:.*]] = load ptr234// LLVM: ret ptr %[[RET]]235 236// OGCG-LABEL: define{{.*}} ptr @_Z20test_cond_lvalue_refbii(237// OGCG: %[[COND:.*]] = alloca i8238// OGCG: %[[X:.*]] = alloca i32239// OGCG: %[[Y:.*]] = alloca i32240// OGCG: %[[COND_VAL:.*]] = load i8, ptr %[[COND]]241// OGCG: %[[BOOL:.*]] = trunc i8 %[[COND_VAL]] to i1242// OGCG: br i1 %[[BOOL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]243// OGCG: [[TRUE_BB]]:244// OGCG: br label %[[MERGE_BB:.*]]245// OGCG: [[FALSE_BB]]:246// OGCG: br label %[[MERGE_BB]]247// OGCG: [[MERGE_BB]]:248// OGCG: %[[PHI:.*]] = phi ptr [ %[[X]], %[[TRUE_BB]] ], [ %[[Y]], %[[FALSE_BB]] ]249// OGCG: ret ptr %[[PHI]]250 251// Test ConditionalOperator as lvalue - compound assignment252void test_cond_lvalue_compound(bool flag) {253 int a = 5;254 int b = 10;255 (flag ? a : b) += 3;256}257 258// CIR-LABEL: cir.func{{.*}} @_Z25test_cond_lvalue_compoundb(259// CIR: %[[FLAG:.*]] = cir.alloca !cir.bool, !cir.ptr<!cir.bool>, ["flag", init]260// CIR: %[[A:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]261// CIR: %[[B:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]262// CIR: %[[FLAG_VAL:.*]] = cir.load{{.*}} %[[FLAG]]263// CIR: %[[LVAL_PTR:.*]] = cir.ternary(%[[FLAG_VAL]], true {264// CIR: cir.yield %[[A]] : !cir.ptr<!s32i>265// CIR: }, false {266// CIR: cir.yield %[[B]] : !cir.ptr<!s32i>267// CIR: }) : (!cir.bool) -> !cir.ptr<!s32i>268// CIR: %[[OLD_VAL:.*]] = cir.load{{.*}} %[[LVAL_PTR]]269// CIR: %[[NEW_VAL:.*]] = cir.binop(add, %[[OLD_VAL]], %{{.*}})270// CIR: cir.store{{.*}} %[[NEW_VAL]], %[[LVAL_PTR]]271 272// LLVM-LABEL: define{{.*}} void @_Z25test_cond_lvalue_compoundb(273// LLVM: %[[FLAG:.*]] = alloca i8274// LLVM: %[[A:.*]] = alloca i32275// LLVM: %[[B:.*]] = alloca i32276// LLVM: %[[FLAG_VAL:.*]] = load i8, ptr %[[FLAG]]277// LLVM: %[[BOOL:.*]] = trunc i8 %[[FLAG_VAL]] to i1278// LLVM: br i1 %[[BOOL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]279// LLVM: [[TRUE_BB]]:280// LLVM: br label %[[MERGE_BB:.*]]281// LLVM: [[FALSE_BB]]:282// LLVM: br label %[[MERGE_BB]]283// LLVM: [[MERGE_BB]]:284// LLVM: %[[PTR:.*]] = phi ptr [ %[[B]], %[[FALSE_BB]] ], [ %[[A]], %[[TRUE_BB]] ]285// LLVM: br label %[[CONT:.*]]286// LLVM: [[CONT]]:287// LLVM: %[[OLD:.*]] = load i32, ptr %[[PTR]]288// LLVM: %[[NEW:.*]] = add{{.*}} i32 %[[OLD]], 3289// LLVM: store i32 %[[NEW]], ptr %[[PTR]]290 291// OGCG-LABEL: define{{.*}} void @_Z25test_cond_lvalue_compoundb(292// OGCG: %[[FLAG:.*]] = alloca i8293// OGCG: %[[A:.*]] = alloca i32294// OGCG: %[[B:.*]] = alloca i32295// OGCG: %[[FLAG_VAL:.*]] = load i8, ptr %[[FLAG]]296// OGCG: %[[BOOL:.*]] = trunc i8 %[[FLAG_VAL]] to i1297// OGCG: br i1 %[[BOOL]], label %[[TRUE_BB:.*]], label %[[FALSE_BB:.*]]298// OGCG: [[TRUE_BB]]:299// OGCG: br label %[[MERGE_BB:.*]]300// OGCG: [[FALSE_BB]]:301// OGCG: br label %[[MERGE_BB]]302// OGCG: [[MERGE_BB]]:303// OGCG: %[[PTR:.*]] = phi ptr [ %[[A]], %[[TRUE_BB]] ], [ %[[B]], %[[FALSE_BB]] ]304// OGCG: %[[OLD:.*]] = load i32, ptr %[[PTR]]305// OGCG: %[[NEW:.*]] = add{{.*}} i32 %[[OLD]], 3306// OGCG: store i32 %[[NEW]], ptr %[[PTR]]307 308// Test constant folding - compile-time true condition with lvalue assignment309void test_cond_const_true_lvalue() {310 int a = 1;311 int b = 2;312 (true ? a : b) = 99;313}314 315// CIR-LABEL: cir.func{{.*}} @_Z27test_cond_const_true_lvaluev(316// CIR: %[[A:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]317// CIR: %[[B:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]318// CIR-NOT: cir.ternary319// CIR: %[[NINETYNINE:.*]] = cir.const #cir.int<99> : !s32i320// CIR: cir.store{{.*}} %[[NINETYNINE]], %[[A]] : !s32i, !cir.ptr<!s32i>321 322// LLVM-LABEL: define{{.*}} void @_Z27test_cond_const_true_lvaluev(323// LLVM: %[[A:.*]] = alloca i32324// LLVM: %[[B:.*]] = alloca i32325// LLVM-NOT: br i1326// LLVM: store i32 99, ptr %[[A]]327 328// OGCG-LABEL: define{{.*}} void @_Z27test_cond_const_true_lvaluev(329// OGCG: %[[A:.*]] = alloca i32330// OGCG: %[[B:.*]] = alloca i32331// OGCG-NOT: br i1332// OGCG: store i32 99, ptr %[[A]]333 334// Test constant folding - compile-time false condition with lvalue assignment335void test_cond_const_false_lvalue() {336 int a = 1;337 int b = 2;338 (false ? a : b) = 88;339}340 341// CIR-LABEL: cir.func{{.*}} @_Z28test_cond_const_false_lvaluev(342// CIR: %[[A:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["a", init]343// CIR: %[[B:.*]] = cir.alloca !s32i, !cir.ptr<!s32i>, ["b", init]344// CIR-NOT: cir.ternary345// CIR: %[[EIGHTYEIGHT:.*]] = cir.const #cir.int<88> : !s32i346// CIR: cir.store{{.*}} %[[EIGHTYEIGHT]], %[[B]] : !s32i, !cir.ptr<!s32i>347 348// LLVM-LABEL: define{{.*}} void @_Z28test_cond_const_false_lvaluev(349// LLVM: %[[A:.*]] = alloca i32350// LLVM: %[[B:.*]] = alloca i32351// LLVM-NOT: br i1352// LLVM: store i32 88, ptr %[[B]]353 354// OGCG-LABEL: define{{.*}} void @_Z28test_cond_const_false_lvaluev(355// OGCG: %[[A:.*]] = alloca i32356// OGCG: %[[B:.*]] = alloca i32357// OGCG-NOT: br i1358// OGCG: store i32 88, ptr %[[B]]359