1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2; RUN: opt < %s -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck --check-prefixes=CHECK %s 3; RUN: opt < %s -debugify -simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S | FileCheck --check-prefixes=DBGINFO %s 4 5define i32 @test1(i1 %C) { 6; CHECK-LABEL: @test1( 7; CHECK-NEXT: entry: 8; CHECK-NEXT: [[DOT:%.*]] = select i1 [[C:%.*]], i32 1, i32 0 9; CHECK-NEXT: ret i32 [[DOT]] 10; 11; DBGINFO-LABEL: @test1( 12; DBGINFO-NEXT: entry: 13; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i32 0, metadata [[META9:![0-9]+]], metadata !DIExpression()), !dbg [[DBG11:![0-9]+]] 14; DBGINFO-NEXT: [[DOT:%.*]] = select i1 [[C:%.*]], i32 1, i32 0 15; DBGINFO-NEXT: ret i32 [[DOT]], !dbg [[DBG12:![0-9]+]] 16; 17entry: 18 br i1 %C, label %T, label %F 19T: ; preds = %entry 20 ret i32 1 21F: ; preds = %entry 22 ret i32 0 23} 24 25define void @test2(i1 %C) { 26; CHECK-LABEL: @test2( 27; CHECK-NEXT: common.ret: 28; CHECK-NEXT: ret void 29; 30; DBGINFO-LABEL: @test2( 31; DBGINFO-NEXT: common.ret: 32; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i32 0, metadata [[META15:![0-9]+]], metadata !DIExpression()), !dbg [[DBG16:![0-9]+]] 33; DBGINFO-NEXT: ret void, !dbg [[DBG17:![0-9]+]] 34; 35 br i1 %C, label %T, label %F 36T: ; preds = %0 37 ret void 38F: ; preds = %0 39 ret void 40} 41 42declare void @sideeffect0() 43declare void @sideeffect1() 44declare void @sideeffect2() 45 46define i32 @test3(i1 %C0, i1 %C1, i32 %v0, i32 %v1, i32 %v2) { 47; CHECK-LABEL: @test3( 48; CHECK-NEXT: entry: 49; CHECK-NEXT: call void @sideeffect0() 50; CHECK-NEXT: br i1 [[C0:%.*]], label [[T:%.*]], label [[F:%.*]] 51; CHECK: end: 52; CHECK-NEXT: [[R:%.*]] = phi i32 [ [[V2:%.*]], [[F]] ], [ [[SPEC_SELECT:%.*]], [[T]] ] 53; CHECK-NEXT: ret i32 [[R]] 54; CHECK: T: 55; CHECK-NEXT: call void @sideeffect1() 56; CHECK-NEXT: [[SPEC_SELECT]] = select i1 [[C1:%.*]], i32 [[V0:%.*]], i32 [[V1:%.*]] 57; CHECK-NEXT: br label [[END:%.*]] 58; CHECK: F: 59; CHECK-NEXT: call void @sideeffect2() 60; CHECK-NEXT: br label [[END]] 61; 62; DBGINFO-LABEL: @test3( 63; DBGINFO-NEXT: entry: 64; DBGINFO-NEXT: call void @sideeffect0(), !dbg [[DBG21:![0-9]+]] 65; DBGINFO-NEXT: br i1 [[C0:%.*]], label [[T:%.*]], label [[F:%.*]], !dbg [[DBG22:![0-9]+]] 66; DBGINFO: end: 67; DBGINFO-NEXT: [[R:%.*]] = phi i32 [ [[V2:%.*]], [[F]] ], [ [[SPEC_SELECT:%.*]], [[T]] ], !dbg [[DBG23:![0-9]+]] 68; DBGINFO-NEXT: call void @llvm.dbg.value(metadata i32 [[R]], metadata [[META20:![0-9]+]], metadata !DIExpression()), !dbg [[DBG23]] 69; DBGINFO-NEXT: ret i32 [[R]], !dbg [[DBG24:![0-9]+]] 70; DBGINFO: T: 71; DBGINFO-NEXT: call void @sideeffect1(), !dbg [[DBG25:![0-9]+]] 72; DBGINFO-NEXT: [[SPEC_SELECT]] = select i1 [[C1:%.*]], i32 [[V0:%.*]], i32 [[V1:%.*]], !dbg [[DBG26:![0-9]+]] 73; DBGINFO-NEXT: br label [[END:%.*]], !dbg [[DBG26]] 74; DBGINFO: F: 75; DBGINFO-NEXT: call void @sideeffect2(), !dbg [[DBG27:![0-9]+]] 76; DBGINFO-NEXT: br label [[END]], !dbg [[DBG28:![0-9]+]] 77; 78entry: 79 call void @sideeffect0() 80 br i1 %C0, label %T, label %F 81 82T.cont: 83 ; empty block with single predecessor 84 br label %end 85 86end: 87 %r = phi i32 [ %v0, %T.cont ], [ %v1, %T ], [ %v2, %F ] 88 ; empty block 89 ret i32 %r 90 91T: 92 call void @sideeffect1() 93 br i1 %C1, label %T.cont, label %end 94 95F: 96 call void @sideeffect2() 97 br label %end 98} 99