blob: 210da7b042e140714eafc84f3a4f3c78ea4c316a [file] [log] [blame]
Andrew Litteken81d3ac02021-07-28 07:59:37 -07001; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs
2; RUN: opt -S -verify -iroutliner -ir-outlining-no-cost < %s | FileCheck %s
3
Andrew Littekenc172f1a2021-07-28 09:22:35 -07004; Here we have multiple exits, but the different sources, same outputs are
5; needed, this checks that they are compressed, and moved into the appropriate
6; output blocks.
Andrew Litteken81d3ac02021-07-28 07:59:37 -07007
8define void @outline_outputs1() #0 {
9entry:
10 %output = alloca i32, align 4
11 %result = alloca i32, align 4
12 %output2 = alloca i32, align 4
13 %result2 = alloca i32, align 4
14 %a = alloca i32, align 4
15 %b = alloca i32, align 4
16 br label %block_2
17block_1:
18 %a2 = alloca i32, align 4
19 %b2 = alloca i32, align 4
20 br label %block_2
21block_2:
22 %a2val = load i32, i32* %a
23 %b2val = load i32, i32* %b
24 %add2 = add i32 2, %a2val
25 %mul2 = mul i32 2, %b2val
26 br label %block_5
27block_3:
28 %aval = load i32, i32* %a
29 %bval = load i32, i32* %b
30 %add = add i32 2, %aval
31 %mul = mul i32 2, %bval
32 br label %block_4
33block_4:
34 store i32 %add, i32* %output, align 4
35 store i32 %mul, i32* %result, align 4
36 br label %block_6
37block_5:
38 store i32 %add2, i32* %output, align 4
39 store i32 %mul2, i32* %result, align 4
40 br label %block_7
41block_6:
42 %div = udiv i32 %aval, %bval
43 ret void
44block_7:
45 %sub = sub i32 %a2val, %b2val
46 ret void
47}
48
49define void @outline_outputs2() #0 {
50entry:
51 %output = alloca i32, align 4
52 %result = alloca i32, align 4
53 %output2 = alloca i32, align 4
54 %result2 = alloca i32, align 4
55 %a = alloca i32, align 4
56 %b = alloca i32, align 4
57 br label %block_2
58block_1:
59 %a2 = alloca i32, align 4
60 %b2 = alloca i32, align 4
61 br label %block_2
62block_2:
63 %a2val = load i32, i32* %a
64 %b2val = load i32, i32* %b
65 %add2 = add i32 2, %a2val
66 %mul2 = mul i32 2, %b2val
67 br label %block_5
68block_3:
69 %aval = load i32, i32* %a
70 %bval = load i32, i32* %b
71 %add = add i32 2, %aval
72 %mul = mul i32 2, %bval
73 br label %block_4
74block_4:
75 store i32 %add, i32* %output, align 4
76 store i32 %mul, i32* %result, align 4
77 br label %block_7
78block_5:
79 store i32 %add2, i32* %output, align 4
80 store i32 %mul2, i32* %result, align 4
81 br label %block_6
82block_6:
83 %diff = sub i32 %a2val, %b2val
84 ret void
85block_7:
86 %quot = udiv i32 %aval, %bval
87 ret void
88}
89; CHECK-LABEL: @outline_outputs1(
90; CHECK-NEXT: entry:
Andrew Littekenc172f1a2021-07-28 09:22:35 -070091; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4
92; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4
93; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4
94; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4
Andrew Litteken81d3ac02021-07-28 07:59:37 -070095; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4
96; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4
97; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4
98; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4
99; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
100; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
101; CHECK-NEXT: br label [[BLOCK_2:%.*]]
102; CHECK: block_1:
103; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4
104; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4
105; CHECK-NEXT: br label [[BLOCK_2]]
106; CHECK: block_2:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700107; CHECK-NEXT: [[LT_CAST:%.*]] = bitcast i32* [[A2VAL_LOC]] to i8*
108; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST]])
109; CHECK-NEXT: [[LT_CAST1:%.*]] = bitcast i32* [[B2VAL_LOC]] to i8*
110; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST1]])
111; CHECK-NEXT: [[LT_CAST2:%.*]] = bitcast i32* [[AVAL_LOC]] to i8*
112; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST2]])
113; CHECK-NEXT: [[LT_CAST3:%.*]] = bitcast i32* [[BVAL_LOC]] to i8*
114; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
115; CHECK-NEXT: [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[OUTPUT]], i32* [[RESULT]], i32* [[A2VAL_LOC]], i32* [[B2VAL_LOC]], i32* [[AVAL_LOC]], i32* [[BVAL_LOC]])
116; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, i32* [[A2VAL_LOC]], align 4
117; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, i32* [[B2VAL_LOC]], align 4
118; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, i32* [[AVAL_LOC]], align 4
119; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, i32* [[BVAL_LOC]], align 4
120; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST]])
121; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST1]])
122; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST2]])
123; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST3]])
124; CHECK-NEXT: br i1 [[TARGETBLOCK]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]]
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700125; CHECK: block_6:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700126; CHECK-NEXT: [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700127; CHECK-NEXT: ret void
128; CHECK: block_7:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700129; CHECK-NEXT: [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700130; CHECK-NEXT: ret void
131;
132;
133; CHECK-LABEL: @outline_outputs2(
134; CHECK-NEXT: entry:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700135; CHECK-NEXT: [[BVAL_LOC:%.*]] = alloca i32, align 4
136; CHECK-NEXT: [[AVAL_LOC:%.*]] = alloca i32, align 4
137; CHECK-NEXT: [[B2VAL_LOC:%.*]] = alloca i32, align 4
138; CHECK-NEXT: [[A2VAL_LOC:%.*]] = alloca i32, align 4
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700139; CHECK-NEXT: [[OUTPUT:%.*]] = alloca i32, align 4
140; CHECK-NEXT: [[RESULT:%.*]] = alloca i32, align 4
141; CHECK-NEXT: [[OUTPUT2:%.*]] = alloca i32, align 4
142; CHECK-NEXT: [[RESULT2:%.*]] = alloca i32, align 4
143; CHECK-NEXT: [[A:%.*]] = alloca i32, align 4
144; CHECK-NEXT: [[B:%.*]] = alloca i32, align 4
145; CHECK-NEXT: br label [[BLOCK_2:%.*]]
146; CHECK: block_1:
147; CHECK-NEXT: [[A2:%.*]] = alloca i32, align 4
148; CHECK-NEXT: [[B2:%.*]] = alloca i32, align 4
149; CHECK-NEXT: br label [[BLOCK_2]]
150; CHECK: block_2:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700151; CHECK-NEXT: [[LT_CAST:%.*]] = bitcast i32* [[A2VAL_LOC]] to i8*
152; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST]])
153; CHECK-NEXT: [[LT_CAST1:%.*]] = bitcast i32* [[B2VAL_LOC]] to i8*
154; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST1]])
155; CHECK-NEXT: [[LT_CAST2:%.*]] = bitcast i32* [[AVAL_LOC]] to i8*
156; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST2]])
157; CHECK-NEXT: [[LT_CAST3:%.*]] = bitcast i32* [[BVAL_LOC]] to i8*
158; CHECK-NEXT: call void @llvm.lifetime.start.p0i8(i64 -1, i8* [[LT_CAST3]])
159; CHECK-NEXT: [[TARGETBLOCK:%.*]] = call i1 @outlined_ir_func_0(i32* [[A]], i32* [[B]], i32* [[OUTPUT]], i32* [[RESULT]], i32* [[A2VAL_LOC]], i32* [[B2VAL_LOC]], i32* [[AVAL_LOC]], i32* [[BVAL_LOC]])
160; CHECK-NEXT: [[A2VAL_RELOAD:%.*]] = load i32, i32* [[A2VAL_LOC]], align 4
161; CHECK-NEXT: [[B2VAL_RELOAD:%.*]] = load i32, i32* [[B2VAL_LOC]], align 4
162; CHECK-NEXT: [[AVAL_RELOAD:%.*]] = load i32, i32* [[AVAL_LOC]], align 4
163; CHECK-NEXT: [[BVAL_RELOAD:%.*]] = load i32, i32* [[BVAL_LOC]], align 4
164; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST]])
165; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST1]])
166; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST2]])
167; CHECK-NEXT: call void @llvm.lifetime.end.p0i8(i64 -1, i8* [[LT_CAST3]])
168; CHECK-NEXT: br i1 [[TARGETBLOCK]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]]
169; CHECK: block_6:
170; CHECK-NEXT: [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]
171; CHECK-NEXT: ret void
172; CHECK: block_7:
173; CHECK-NEXT: [[QUOT:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]
174; CHECK-NEXT: ret void
175;
176;
177; CHECK: define internal i1 @outlined_ir_func_0(
178; CHECK-NEXT: newFuncRoot:
179; CHECK-NEXT: br label [[BLOCK_2_TO_OUTLINE:%.*]]
180; CHECK: block_2_to_outline:
181; CHECK-NEXT: [[A2VAL:%.*]] = load i32, i32* [[TMP0:%.*]], align 4
182; CHECK-NEXT: [[B2VAL:%.*]] = load i32, i32* [[TMP1:%.*]], align 4
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700183; CHECK-NEXT: [[ADD2:%.*]] = add i32 2, [[A2VAL]]
184; CHECK-NEXT: [[MUL2:%.*]] = mul i32 2, [[B2VAL]]
185; CHECK-NEXT: br label [[BLOCK_5:%.*]]
186; CHECK: block_3:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700187; CHECK-NEXT: [[AVAL:%.*]] = load i32, i32* [[TMP0]], align 4
188; CHECK-NEXT: [[BVAL:%.*]] = load i32, i32* [[TMP1]], align 4
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700189; CHECK-NEXT: [[ADD:%.*]] = add i32 2, [[AVAL]]
190; CHECK-NEXT: [[MUL:%.*]] = mul i32 2, [[BVAL]]
191; CHECK-NEXT: br label [[BLOCK_4:%.*]]
192; CHECK: block_4:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700193; CHECK-NEXT: store i32 [[ADD]], i32* [[TMP2:%.*]], align 4
194; CHECK-NEXT: store i32 [[MUL]], i32* [[TMP3:%.*]], align 4
195; CHECK-NEXT: br label [[BLOCK_6_EXITSTUB:%.*]]
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700196; CHECK: block_5:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700197; CHECK-NEXT: store i32 [[ADD2]], i32* [[TMP2]], align 4
198; CHECK-NEXT: store i32 [[MUL2]], i32* [[TMP3]], align 4
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700199; CHECK-NEXT: br label [[BLOCK_7_EXITSTUB:%.*]]
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700200; CHECK: block_6.exitStub:
201; CHECK-NEXT: store i32 [[AVAL]], i32* [[TMP6:%.*]], align 4
202; CHECK-NEXT: store i32 [[BVAL]], i32* [[TMP7:%.*]], align 4
203; CHECK-NEXT: ret i1 true
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700204; CHECK: block_7.exitStub:
Andrew Littekenc172f1a2021-07-28 09:22:35 -0700205; CHECK-NEXT: store i32 [[A2VAL]], i32* [[TMP4:%.*]], align 4
206; CHECK-NEXT: store i32 [[B2VAL]], i32* [[TMP5:%.*]], align 4
207; CHECK-NEXT: ret i1 false
Andrew Litteken81d3ac02021-07-28 07:59:37 -0700208;