1; RUN: llvm-extract -bb 'foo:if;then;else' -bb 'bar:bb14;bb20' -S %s  | FileCheck %s
2; Extract two groups of basic blocks in two different functions.
3
4
5; The first extracted function is the region composed by the
6; blocks if, then, and else from foo.
7; CHECK: define dso_local void @foo.if.split(i32 %arg1, i32 %arg, i32* %tmp.0.ce.out) {
8; CHECK: newFuncRoot:
9; CHECK:   br label %if.split
10;
11; CHECK: end.exitStub:                                     ; preds = %end.split
12; CHECK:   ret void
13;
14; CHECK: then:                                             ; preds = %if.split
15; CHECK:   %tmp12 = shl i32 %arg1, 2
16; CHECK:   %tmp13 = add nsw i32 %tmp12, %arg
17; CHECK:   br label %end.split
18;
19; CHECK: else:                                             ; preds = %if.split
20; CHECK:   %tmp22 = mul nsw i32 %arg, 3
21; CHECK:   %tmp24 = sdiv i32 %arg1, 6
22; CHECK:   %tmp25 = add nsw i32 %tmp24, %tmp22
23; CHECK:   br label %end.split
24;
25; CHECK: if.split:                                         ; preds = %newFuncRoot
26; CHECK:   %tmp5 = icmp sgt i32 %arg, 0
27; CHECK:   %tmp8 = icmp sgt i32 %arg1, 0
28; CHECK:   %or.cond = and i1 %tmp5, %tmp8
29; CHECK:   br i1 %or.cond, label %then, label %else
30;
31; CHECK: end.split:                                        ; preds = %then, %else
32; CHECK:   %tmp.0.ce = phi i32 [ %tmp13, %then ], [ %tmp25, %else ]
33; CHECK:   store i32 %tmp.0.ce, i32* %tmp.0.ce.out
34; CHECK:   br label %end.exitStub
35; CHECK: }
36
37; The second extracted function is the region composed by the blocks
38; bb14 and bb20 from bar.
39; CHECK: define dso_local i1 @bar.bb14(i32 %arg1, i32 %arg, i32* %tmp25.out) {
40; CHECK: newFuncRoot:
41; CHECK:   br label %bb14
42;
43; CHECK: bb26.exitStub:                                    ; preds = %bb14
44; CHECK:   ret i1 true
45;
46; CHECK: bb30.exitStub:                                    ; preds = %bb20
47; CHECK:   ret i1 false
48;
49; CHECK: bb14:                                             ; preds = %newFuncRoot
50; CHECK:   %tmp0 = and i32 %arg1, %arg
51; CHECK:   %tmp1 = icmp slt i32 %tmp0, 0
52; CHECK:   br i1 %tmp1, label %bb20, label %bb26.exitStub
53;
54; CHECK: bb20:                                             ; preds = %bb14
55; CHECK:   %tmp22 = mul nsw i32 %arg, 3
56; CHECK:   %tmp24 = sdiv i32 %arg1, 6
57; CHECK:   %tmp25 = add nsw i32 %tmp24, %tmp22
58; CHECK:   store i32 %tmp25, i32* %tmp25.out
59; CHECK:   br label %bb30.exitStub
60; CHECK: }
61
62define i32 @foo(i32 %arg, i32 %arg1) {
63if:
64  %tmp5 = icmp sgt i32 %arg, 0
65  %tmp8 = icmp sgt i32 %arg1, 0
66  %or.cond = and i1 %tmp5, %tmp8
67  br i1 %or.cond, label %then, label %else
68
69then:
70  %tmp12 = shl i32 %arg1, 2
71  %tmp13 = add nsw i32 %tmp12, %arg
72  br label %end
73
74else:
75  %tmp22 = mul nsw i32 %arg, 3
76  %tmp24 = sdiv i32 %arg1, 6
77  %tmp25 = add nsw i32 %tmp24, %tmp22
78  br label %end
79
80end:
81  %tmp.0 = phi i32 [ %tmp13, %then ], [ %tmp25, %else ]
82  %and0 = and i32 %tmp.0, %arg
83  %cmp1 = icmp slt i32 %and0, 0
84  br i1 %cmp1, label %ret0, label %ret1
85
86ret0:
87  ret i32 0
88
89ret1:
90  ret i32 1
91}
92
93define i32 @bar(i32 %arg, i32 %arg1) {
94bb:
95  %tmp5 = icmp sgt i32 %arg, 0
96  %tmp8 = icmp sgt i32 %arg1, 0
97  %or.cond = and i1 %tmp5, %tmp8
98  br i1 %or.cond, label %bb9, label %bb14
99
100bb9:                                              ; preds = %bb
101  %tmp12 = shl i32 %arg1, 2
102  %tmp13 = add nsw i32 %tmp12, %arg
103  br label %bb30
104
105bb14:                                             ; preds = %bb
106  %tmp0 = and i32 %arg1, %arg
107  %tmp1 = icmp slt i32 %tmp0, 0
108  br i1 %tmp1, label %bb20, label %bb26
109
110bb20:                                             ; preds = %bb14
111  %tmp22 = mul nsw i32 %arg, 3
112  %tmp24 = sdiv i32 %arg1, 6
113  %tmp25 = add nsw i32 %tmp24, %tmp22
114  br label %bb30
115
116bb26:                                             ; preds = %bb14
117  %tmp29 = sub nsw i32 %arg, %arg1
118  br label %bb30
119
120bb30:                                             ; preds = %bb26, %bb20, %bb9
121  %tmp.0 = phi i32 [ %tmp13, %bb9 ], [ %tmp25, %bb20 ], [ %tmp29, %bb26 ]
122  ret i32 %tmp.0
123}
124
125