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