1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 2 2; RUN: opt < %s -S -passes='simplifycfg<speculate-blocks>' | FileCheck %s --check-prefix=YES 3; RUN: opt < %s -S -passes='simplifycfg<no-speculate-blocks>' | FileCheck %s --check-prefix=NO 4 5define i32 @f(i1 %a) { 6; YES-LABEL: define i32 @f 7; YES-SAME: (i1 [[A:%.*]]) { 8; YES-NEXT: entry: 9; YES-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[A]], i32 5, i32 2 10; YES-NEXT: ret i32 [[SPEC_SELECT]] 11; 12; NO-LABEL: define i32 @f 13; NO-SAME: (i1 [[A:%.*]]) { 14; NO-NEXT: entry: 15; NO-NEXT: br i1 [[A]], label [[BB:%.*]], label [[BB2:%.*]] 16; NO: bb: 17; NO-NEXT: br label [[BB2]] 18; NO: bb2: 19; NO-NEXT: [[R:%.*]] = phi i32 [ 2, [[ENTRY:%.*]] ], [ 5, [[BB]] ] 20; NO-NEXT: ret i32 [[R]] 21; 22entry: 23 br i1 %a, label %bb, label %bb2 24bb: 25 br label %bb2 26bb2: 27 %r = phi i32 [ 2, %entry ], [ 5, %bb ] 28 ret i32 %r 29} 30 31define void @fold_branch_to_common_dest(i8 %v0, i8 %v1) { 32; YES-LABEL: define void @fold_branch_to_common_dest 33; YES-SAME: (i8 [[V0:%.*]], i8 [[V1:%.*]]) { 34; YES-NEXT: pred: 35; YES-NEXT: [[C0:%.*]] = icmp eq i8 [[V0]], 0 36; YES-NEXT: [[C1:%.*]] = icmp eq i8 [[V1]], 0 37; YES-NEXT: [[OR_COND:%.*]] = select i1 [[C0]], i1 [[C1]], i1 false 38; YES-NEXT: br i1 [[OR_COND]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT:%.*]] 39; YES: common.ret: 40; YES-NEXT: ret void 41; YES: final_left: 42; YES-NEXT: call void @sideeffect0() 43; YES-NEXT: br label [[COMMON_RET:%.*]] 44; YES: final_right: 45; YES-NEXT: call void @sideeffect1() 46; YES-NEXT: br label [[COMMON_RET]] 47; 48; NO-LABEL: define void @fold_branch_to_common_dest 49; NO-SAME: (i8 [[V0:%.*]], i8 [[V1:%.*]]) { 50; NO-NEXT: pred: 51; NO-NEXT: [[C0:%.*]] = icmp eq i8 [[V0]], 0 52; NO-NEXT: br i1 [[C0]], label [[DISPATCH:%.*]], label [[FINAL_RIGHT:%.*]] 53; NO: dispatch: 54; NO-NEXT: [[C1:%.*]] = icmp eq i8 [[V1]], 0 55; NO-NEXT: br i1 [[C1]], label [[FINAL_LEFT:%.*]], label [[FINAL_RIGHT]] 56; NO: common.ret: 57; NO-NEXT: ret void 58; NO: final_left: 59; NO-NEXT: call void @sideeffect0() 60; NO-NEXT: br label [[COMMON_RET:%.*]] 61; NO: final_right: 62; NO-NEXT: call void @sideeffect1() 63; NO-NEXT: br label [[COMMON_RET]] 64; 65pred: 66 %c0 = icmp eq i8 %v0, 0 67 br i1 %c0, label %dispatch, label %final_right 68dispatch: 69 %c1 = icmp eq i8 %v1, 0 70 br i1 %c1, label %final_left, label %final_right 71final_left: 72 call void @sideeffect0() 73 ret void 74final_right: 75 call void @sideeffect1() 76 ret void 77} 78 79declare void @sideeffect0() 80declare void @sideeffect1() 81