blob: 0527cdd7061b8b655d69b5fc482ec8f5e53be635 [file] [log] [blame]
Quentin Colombet2d977932019-04-29 16:14:03 +00001; 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