xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-multiple-exits-diff-outputs.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
1c172f1adSAndrew Litteken; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --include-generated-funcs
29dd9575cSRoman Lebedev; RUN: opt -S -passes=verify,iroutliner -ir-outlining-no-cost < %s | FileCheck %s
3c172f1adSAndrew Litteken
4c172f1adSAndrew Litteken; Here we have multiple exits, but the different sources, different outputs are
5c172f1adSAndrew Litteken; needed, this checks that they are handled by separate switch statements.
6c172f1adSAndrew Litteken
7c172f1adSAndrew Littekendefine void @outline_outputs1() #0 {
8c172f1adSAndrew Littekenentry:
9c172f1adSAndrew Litteken  %output = alloca i32, align 4
10c172f1adSAndrew Litteken  %result = alloca i32, align 4
11c172f1adSAndrew Litteken  %output2 = alloca i32, align 4
12c172f1adSAndrew Litteken  %result2 = alloca i32, align 4
13c172f1adSAndrew Litteken  %a = alloca i32, align 4
14c172f1adSAndrew Litteken  %b = alloca i32, align 4
15c172f1adSAndrew Litteken  br label %block_2
16c172f1adSAndrew Littekenblock_1:
17c172f1adSAndrew Litteken  %a2 = alloca i32, align 4
18c172f1adSAndrew Litteken  %b2 = alloca i32, align 4
19c172f1adSAndrew Litteken  br label %block_2
20c172f1adSAndrew Littekenblock_2:
21*f4b925eeSMatt Arsenault  %a2val = load i32, ptr %a
22*f4b925eeSMatt Arsenault  %b2val = load i32, ptr %b
23c172f1adSAndrew Litteken  %add2 = add i32 2, %a2val
24c172f1adSAndrew Litteken  %mul2 = mul i32 2, %b2val
25c172f1adSAndrew Litteken  br label %block_5
26c172f1adSAndrew Littekenblock_3:
27*f4b925eeSMatt Arsenault  %aval = load i32, ptr %a
28*f4b925eeSMatt Arsenault  %bval = load i32, ptr %b
29c172f1adSAndrew Litteken  %add = add i32 2, %aval
30c172f1adSAndrew Litteken  %mul = mul i32 2, %bval
31c172f1adSAndrew Litteken  br label %block_4
32c172f1adSAndrew Littekenblock_4:
33*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
34*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
35c172f1adSAndrew Litteken  br label %block_6
36c172f1adSAndrew Littekenblock_5:
37*f4b925eeSMatt Arsenault  store i32 %add2, ptr %output, align 4
38*f4b925eeSMatt Arsenault  store i32 %mul2, ptr %result, align 4
39c172f1adSAndrew Litteken  br label %block_7
40c172f1adSAndrew Littekenblock_6:
41c172f1adSAndrew Litteken  %div = udiv i32 %aval, %bval
42c172f1adSAndrew Litteken  ret void
43c172f1adSAndrew Littekenblock_7:
44c172f1adSAndrew Litteken  %sub = sub i32 %a2val, %b2val
45c172f1adSAndrew Litteken  ret void
46c172f1adSAndrew Litteken}
47c172f1adSAndrew Litteken
48c172f1adSAndrew Littekendefine void @outline_outputs2() #0 {
49c172f1adSAndrew Littekenentry:
50c172f1adSAndrew Litteken  %output = alloca i32, align 4
51c172f1adSAndrew Litteken  %result = alloca i32, align 4
52c172f1adSAndrew Litteken  %output2 = alloca i32, align 4
53c172f1adSAndrew Litteken  %result2 = alloca i32, align 4
54c172f1adSAndrew Litteken  %a = alloca i32, align 4
55c172f1adSAndrew Litteken  %b = alloca i32, align 4
56c172f1adSAndrew Litteken  br label %block_2
57c172f1adSAndrew Littekenblock_1:
58c172f1adSAndrew Litteken  %a2 = alloca i32, align 4
59c172f1adSAndrew Litteken  %b2 = alloca i32, align 4
60c172f1adSAndrew Litteken  br label %block_2
61c172f1adSAndrew Littekenblock_2:
62*f4b925eeSMatt Arsenault  %a2val = load i32, ptr %a
63*f4b925eeSMatt Arsenault  %b2val = load i32, ptr %b
64c172f1adSAndrew Litteken  %add2 = add i32 2, %a2val
65c172f1adSAndrew Litteken  %mul2 = mul i32 2, %b2val
66c172f1adSAndrew Litteken  br label %block_5
67c172f1adSAndrew Littekenblock_3:
68*f4b925eeSMatt Arsenault  %aval = load i32, ptr %a
69*f4b925eeSMatt Arsenault  %bval = load i32, ptr %b
70c172f1adSAndrew Litteken  %add = add i32 2, %aval
71c172f1adSAndrew Litteken  %mul = mul i32 2, %bval
72c172f1adSAndrew Litteken  br label %block_4
73c172f1adSAndrew Littekenblock_4:
74*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
75*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
76c172f1adSAndrew Litteken  br label %block_7
77c172f1adSAndrew Littekenblock_5:
78*f4b925eeSMatt Arsenault  store i32 %add2, ptr %output, align 4
79*f4b925eeSMatt Arsenault  store i32 %mul2, ptr %result, align 4
80c172f1adSAndrew Litteken  br label %block_6
81c172f1adSAndrew Littekenblock_6:
82c172f1adSAndrew Litteken  %diff = sub i32 %a2val, %b2val
83c172f1adSAndrew Litteken  ret void
84c172f1adSAndrew Littekenblock_7:
85c172f1adSAndrew Litteken  %quot = udiv i32 %add, %mul
86c172f1adSAndrew Litteken  ret void
87c172f1adSAndrew Litteken}
88c172f1adSAndrew Litteken; CHECK-LABEL: @outline_outputs1(
89c172f1adSAndrew Litteken; CHECK-NEXT:  entry:
90c172f1adSAndrew Litteken; CHECK-NEXT:    [[BVAL_LOC:%.*]] = alloca i32, align 4
91c172f1adSAndrew Litteken; CHECK-NEXT:    [[AVAL_LOC:%.*]] = alloca i32, align 4
92c172f1adSAndrew Litteken; CHECK-NEXT:    [[B2VAL_LOC:%.*]] = alloca i32, align 4
93c172f1adSAndrew Litteken; CHECK-NEXT:    [[A2VAL_LOC:%.*]] = alloca i32, align 4
94c172f1adSAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
95c172f1adSAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
96c172f1adSAndrew Litteken; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4
97c172f1adSAndrew Litteken; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4
98c172f1adSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
99c172f1adSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
100c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2:%.*]]
101c172f1adSAndrew Litteken; CHECK:       block_1:
102c172f1adSAndrew Litteken; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4
103c172f1adSAndrew Litteken; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4
104c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2]]
105c172f1adSAndrew Litteken; CHECK:       block_2:
106*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]])
107*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]])
108*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[AVAL_LOC]])
109*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[BVAL_LOC]])
110*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[AVAL_LOC]], ptr [[BVAL_LOC]], i32 0)
111*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4
112*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4
113*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4
114*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4
115*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]])
116*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]])
117*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[AVAL_LOC]])
118*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[BVAL_LOC]])
119c172f1adSAndrew Litteken; CHECK-NEXT:    br i1 [[TMP0]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]]
120c172f1adSAndrew Litteken; CHECK:       block_6:
121c172f1adSAndrew Litteken; CHECK-NEXT:    [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]
122c172f1adSAndrew Litteken; CHECK-NEXT:    ret void
123c172f1adSAndrew Litteken; CHECK:       block_7:
124c172f1adSAndrew Litteken; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]
125c172f1adSAndrew Litteken; CHECK-NEXT:    ret void
126c172f1adSAndrew Litteken;
127c172f1adSAndrew Litteken;
128c172f1adSAndrew Litteken; CHECK-LABEL: @outline_outputs2(
129c172f1adSAndrew Litteken; CHECK-NEXT:  entry:
130c172f1adSAndrew Litteken; CHECK-NEXT:    [[MUL_LOC:%.*]] = alloca i32, align 4
131c172f1adSAndrew Litteken; CHECK-NEXT:    [[ADD_LOC:%.*]] = alloca i32, align 4
132c172f1adSAndrew Litteken; CHECK-NEXT:    [[B2VAL_LOC:%.*]] = alloca i32, align 4
133c172f1adSAndrew Litteken; CHECK-NEXT:    [[A2VAL_LOC:%.*]] = alloca i32, align 4
134c172f1adSAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
135c172f1adSAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
136c172f1adSAndrew Litteken; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4
137c172f1adSAndrew Litteken; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4
138c172f1adSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
139c172f1adSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
140c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2:%.*]]
141c172f1adSAndrew Litteken; CHECK:       block_1:
142c172f1adSAndrew Litteken; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4
143c172f1adSAndrew Litteken; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4
144c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2]]
145c172f1adSAndrew Litteken; CHECK:       block_2:
146*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]])
147*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]])
148*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[ADD_LOC]])
149*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[MUL_LOC]])
150*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TMP0:%.*]] = call i1 @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[A2VAL_LOC]], ptr [[B2VAL_LOC]], ptr [[ADD_LOC]], ptr [[MUL_LOC]], i32 1)
151*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4
152*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4
153*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[ADD_RELOAD:%.*]] = load i32, ptr [[ADD_LOC]], align 4
154*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[MUL_RELOAD:%.*]] = load i32, ptr [[MUL_LOC]], align 4
155*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]])
156*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]])
157*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[ADD_LOC]])
158*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[MUL_LOC]])
159c172f1adSAndrew Litteken; CHECK-NEXT:    br i1 [[TMP0]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]]
160c172f1adSAndrew Litteken; CHECK:       block_6:
161c172f1adSAndrew Litteken; CHECK-NEXT:    [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]
162c172f1adSAndrew Litteken; CHECK-NEXT:    ret void
163c172f1adSAndrew Litteken; CHECK:       block_7:
164c172f1adSAndrew Litteken; CHECK-NEXT:    [[QUOT:%.*]] = udiv i32 [[ADD_RELOAD]], [[MUL_RELOAD]]
165c172f1adSAndrew Litteken; CHECK-NEXT:    ret void
166c172f1adSAndrew Litteken;
167c172f1adSAndrew Litteken;
168c172f1adSAndrew Litteken; CHECK: define internal i1 @outlined_ir_func_0(
169c172f1adSAndrew Litteken; CHECK-NEXT:  newFuncRoot:
170c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2_TO_OUTLINE:%.*]]
171c172f1adSAndrew Litteken; CHECK:       block_2_to_outline:
172*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
173*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4
174c172f1adSAndrew Litteken; CHECK-NEXT:    [[ADD2:%.*]] = add i32 2, [[A2VAL]]
175c172f1adSAndrew Litteken; CHECK-NEXT:    [[MUL2:%.*]] = mul i32 2, [[B2VAL]]
176c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_5:%.*]]
177c172f1adSAndrew Litteken; CHECK:       block_3:
178*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4
179*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4
180c172f1adSAndrew Litteken; CHECK-NEXT:    [[ADD:%.*]] = add i32 2, [[AVAL]]
181c172f1adSAndrew Litteken; CHECK-NEXT:    [[MUL:%.*]] = mul i32 2, [[BVAL]]
182c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_4:%.*]]
183c172f1adSAndrew Litteken; CHECK:       block_4:
184*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[TMP2:%.*]], align 4
185*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL]], ptr [[TMP3:%.*]], align 4
186c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6_EXITSTUB:%.*]]
187c172f1adSAndrew Litteken; CHECK:       block_5:
188*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD2]], ptr [[TMP2]], align 4
189*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL2]], ptr [[TMP3]], align 4
190c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_7_EXITSTUB:%.*]]
191c172f1adSAndrew Litteken; CHECK:       block_6.exitStub:
192c172f1adSAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP8:%.*]], label [[FINAL_BLOCK_1:%.*]] [
193c172f1adSAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_0_1:%.*]]
194c172f1adSAndrew Litteken; CHECK-NEXT:    i32 1, label [[OUTPUT_BLOCK_1_1:%.*]]
195c172f1adSAndrew Litteken; CHECK-NEXT:    ]
196c172f1adSAndrew Litteken; CHECK:       block_7.exitStub:
197c172f1adSAndrew Litteken; CHECK-NEXT:    switch i32 [[TMP8]], label [[FINAL_BLOCK_0:%.*]] [
198c172f1adSAndrew Litteken; CHECK-NEXT:    i32 0, label [[OUTPUT_BLOCK_0_0:%.*]]
199c172f1adSAndrew Litteken; CHECK-NEXT:    i32 1, label [[OUTPUT_BLOCK_1_0:%.*]]
200c172f1adSAndrew Litteken; CHECK-NEXT:    ]
201c172f1adSAndrew Litteken; CHECK:       output_block_0_0:
202*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[A2VAL]], ptr [[TMP4:%.*]], align 4
203*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[B2VAL]], ptr [[TMP5:%.*]], align 4
204c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_0]]
205c172f1adSAndrew Litteken; CHECK:       output_block_0_1:
206*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[AVAL]], ptr [[TMP6:%.*]], align 4
207*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[BVAL]], ptr [[TMP7:%.*]], align 4
208c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_1]]
209c172f1adSAndrew Litteken; CHECK:       output_block_1_0:
210*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[A2VAL]], ptr [[TMP4]], align 4
211*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[B2VAL]], ptr [[TMP5]], align 4
212c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_0]]
213c172f1adSAndrew Litteken; CHECK:       output_block_1_1:
214*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[TMP6]], align 4
215*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL]], ptr [[TMP7]], align 4
216c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[FINAL_BLOCK_1]]
217c172f1adSAndrew Litteken; CHECK:       final_block_0:
218c172f1adSAndrew Litteken; CHECK-NEXT:    ret i1 false
219c172f1adSAndrew Litteken; CHECK:       final_block_1:
220c172f1adSAndrew Litteken; CHECK-NEXT:    ret i1 true
221c172f1adSAndrew Litteken;
222