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