xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-multiple-exits.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
181d3ac0cSAndrew 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
381d3ac0cSAndrew Litteken
4c172f1adSAndrew Litteken; Here we have multiple exits, but the different sources, same outputs are
5c172f1adSAndrew Litteken; needed, this checks that they are compressed, and moved into the appropriate
6c172f1adSAndrew Litteken; output blocks.
781d3ac0cSAndrew Litteken
881d3ac0cSAndrew Littekendefine void @outline_outputs1() #0 {
981d3ac0cSAndrew Littekenentry:
1081d3ac0cSAndrew Litteken  %output = alloca i32, align 4
1181d3ac0cSAndrew Litteken  %result = alloca i32, align 4
1281d3ac0cSAndrew Litteken  %output2 = alloca i32, align 4
1381d3ac0cSAndrew Litteken  %result2 = alloca i32, align 4
1481d3ac0cSAndrew Litteken  %a = alloca i32, align 4
1581d3ac0cSAndrew Litteken  %b = alloca i32, align 4
1681d3ac0cSAndrew Litteken  br label %block_2
1781d3ac0cSAndrew Littekenblock_1:
1881d3ac0cSAndrew Litteken  %a2 = alloca i32, align 4
1981d3ac0cSAndrew Litteken  %b2 = alloca i32, align 4
2081d3ac0cSAndrew Litteken  br label %block_2
2181d3ac0cSAndrew Littekenblock_2:
22*f4b925eeSMatt Arsenault  %a2val = load i32, ptr %a
23*f4b925eeSMatt Arsenault  %b2val = load i32, ptr %b
2481d3ac0cSAndrew Litteken  %add2 = add i32 2, %a2val
2581d3ac0cSAndrew Litteken  %mul2 = mul i32 2, %b2val
2681d3ac0cSAndrew Litteken  br label %block_5
2781d3ac0cSAndrew Littekenblock_3:
28*f4b925eeSMatt Arsenault  %aval = load i32, ptr %a
29*f4b925eeSMatt Arsenault  %bval = load i32, ptr %b
3081d3ac0cSAndrew Litteken  %add = add i32 2, %aval
3181d3ac0cSAndrew Litteken  %mul = mul i32 2, %bval
3281d3ac0cSAndrew Litteken  br label %block_4
3381d3ac0cSAndrew Littekenblock_4:
34*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
35*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
3681d3ac0cSAndrew Litteken  br label %block_6
3781d3ac0cSAndrew Littekenblock_5:
38*f4b925eeSMatt Arsenault  store i32 %add2, ptr %output, align 4
39*f4b925eeSMatt Arsenault  store i32 %mul2, ptr %result, align 4
4081d3ac0cSAndrew Litteken  br label %block_7
4181d3ac0cSAndrew Littekenblock_6:
4281d3ac0cSAndrew Litteken  %div = udiv i32 %aval, %bval
4381d3ac0cSAndrew Litteken  ret void
4481d3ac0cSAndrew Littekenblock_7:
4581d3ac0cSAndrew Litteken  %sub = sub i32 %a2val, %b2val
4681d3ac0cSAndrew Litteken  ret void
4781d3ac0cSAndrew Litteken}
4881d3ac0cSAndrew Litteken
4981d3ac0cSAndrew Littekendefine void @outline_outputs2() #0 {
5081d3ac0cSAndrew Littekenentry:
5181d3ac0cSAndrew Litteken  %output = alloca i32, align 4
5281d3ac0cSAndrew Litteken  %result = alloca i32, align 4
5381d3ac0cSAndrew Litteken  %output2 = alloca i32, align 4
5481d3ac0cSAndrew Litteken  %result2 = alloca i32, align 4
5581d3ac0cSAndrew Litteken  %a = alloca i32, align 4
5681d3ac0cSAndrew Litteken  %b = alloca i32, align 4
5781d3ac0cSAndrew Litteken  br label %block_2
5881d3ac0cSAndrew Littekenblock_1:
5981d3ac0cSAndrew Litteken  %a2 = alloca i32, align 4
6081d3ac0cSAndrew Litteken  %b2 = alloca i32, align 4
6181d3ac0cSAndrew Litteken  br label %block_2
6281d3ac0cSAndrew Littekenblock_2:
63*f4b925eeSMatt Arsenault  %a2val = load i32, ptr %a
64*f4b925eeSMatt Arsenault  %b2val = load i32, ptr %b
6581d3ac0cSAndrew Litteken  %add2 = add i32 2, %a2val
6681d3ac0cSAndrew Litteken  %mul2 = mul i32 2, %b2val
6781d3ac0cSAndrew Litteken  br label %block_5
6881d3ac0cSAndrew Littekenblock_3:
69*f4b925eeSMatt Arsenault  %aval = load i32, ptr %a
70*f4b925eeSMatt Arsenault  %bval = load i32, ptr %b
7181d3ac0cSAndrew Litteken  %add = add i32 2, %aval
7281d3ac0cSAndrew Litteken  %mul = mul i32 2, %bval
7381d3ac0cSAndrew Litteken  br label %block_4
7481d3ac0cSAndrew Littekenblock_4:
75*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
76*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
7781d3ac0cSAndrew Litteken  br label %block_7
7881d3ac0cSAndrew Littekenblock_5:
79*f4b925eeSMatt Arsenault  store i32 %add2, ptr %output, align 4
80*f4b925eeSMatt Arsenault  store i32 %mul2, ptr %result, align 4
8181d3ac0cSAndrew Litteken  br label %block_6
8281d3ac0cSAndrew Littekenblock_6:
8381d3ac0cSAndrew Litteken  %diff = sub i32 %a2val, %b2val
8481d3ac0cSAndrew Litteken  ret void
8581d3ac0cSAndrew Littekenblock_7:
8681d3ac0cSAndrew Litteken  %quot = udiv i32 %aval, %bval
8781d3ac0cSAndrew Litteken  ret void
8881d3ac0cSAndrew Litteken}
8981d3ac0cSAndrew Litteken; CHECK-LABEL: @outline_outputs1(
9081d3ac0cSAndrew Litteken; CHECK-NEXT:  entry:
91c172f1adSAndrew Litteken; CHECK-NEXT:    [[BVAL_LOC:%.*]] = alloca i32, align 4
92c172f1adSAndrew Litteken; CHECK-NEXT:    [[AVAL_LOC:%.*]] = alloca i32, align 4
93c172f1adSAndrew Litteken; CHECK-NEXT:    [[B2VAL_LOC:%.*]] = alloca i32, align 4
94c172f1adSAndrew Litteken; CHECK-NEXT:    [[A2VAL_LOC:%.*]] = alloca i32, align 4
9581d3ac0cSAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
9681d3ac0cSAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
9781d3ac0cSAndrew Litteken; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4
9881d3ac0cSAndrew Litteken; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4
9981d3ac0cSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
10081d3ac0cSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
10181d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2:%.*]]
10281d3ac0cSAndrew Litteken; CHECK:       block_1:
10381d3ac0cSAndrew Litteken; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4
10481d3ac0cSAndrew Litteken; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4
10581d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2]]
10681d3ac0cSAndrew Litteken; CHECK:       block_2:
107*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]])
108*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]])
109*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[AVAL_LOC]])
110*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[BVAL_LOC]])
111*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = 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]])
112*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4
113*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4
114*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4
115*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4
116*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]])
117*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]])
118*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[AVAL_LOC]])
119*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[BVAL_LOC]])
120c172f1adSAndrew Litteken; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[BLOCK_6:%.*]], label [[BLOCK_7:%.*]]
12181d3ac0cSAndrew Litteken; CHECK:       block_6:
122c172f1adSAndrew Litteken; CHECK-NEXT:    [[DIV:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]
12381d3ac0cSAndrew Litteken; CHECK-NEXT:    ret void
12481d3ac0cSAndrew Litteken; CHECK:       block_7:
125c172f1adSAndrew Litteken; CHECK-NEXT:    [[SUB:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]
12681d3ac0cSAndrew Litteken; CHECK-NEXT:    ret void
12781d3ac0cSAndrew Litteken;
12881d3ac0cSAndrew Litteken;
12981d3ac0cSAndrew Litteken; CHECK-LABEL: @outline_outputs2(
13081d3ac0cSAndrew Litteken; CHECK-NEXT:  entry:
131c172f1adSAndrew Litteken; CHECK-NEXT:    [[BVAL_LOC:%.*]] = alloca i32, align 4
132c172f1adSAndrew Litteken; CHECK-NEXT:    [[AVAL_LOC:%.*]] = alloca i32, align 4
133c172f1adSAndrew Litteken; CHECK-NEXT:    [[B2VAL_LOC:%.*]] = alloca i32, align 4
134c172f1adSAndrew Litteken; CHECK-NEXT:    [[A2VAL_LOC:%.*]] = alloca i32, align 4
13581d3ac0cSAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
13681d3ac0cSAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
13781d3ac0cSAndrew Litteken; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4
13881d3ac0cSAndrew Litteken; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4
13981d3ac0cSAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
14081d3ac0cSAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
14181d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2:%.*]]
14281d3ac0cSAndrew Litteken; CHECK:       block_1:
14381d3ac0cSAndrew Litteken; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4
14481d3ac0cSAndrew Litteken; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4
14581d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2]]
14681d3ac0cSAndrew Litteken; CHECK:       block_2:
147*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[A2VAL_LOC]])
148*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[B2VAL_LOC]])
149*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[AVAL_LOC]])
150*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[BVAL_LOC]])
151*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[TARGETBLOCK:%.*]] = 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]])
152*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL_RELOAD:%.*]] = load i32, ptr [[A2VAL_LOC]], align 4
153*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL_RELOAD:%.*]] = load i32, ptr [[B2VAL_LOC]], align 4
154*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AVAL_RELOAD:%.*]] = load i32, ptr [[AVAL_LOC]], align 4
155*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BVAL_RELOAD:%.*]] = load i32, ptr [[BVAL_LOC]], align 4
156*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[A2VAL_LOC]])
157*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[B2VAL_LOC]])
158*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[AVAL_LOC]])
159*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[BVAL_LOC]])
160c172f1adSAndrew Litteken; CHECK-NEXT:    br i1 [[TARGETBLOCK]], label [[BLOCK_7:%.*]], label [[BLOCK_6:%.*]]
161c172f1adSAndrew Litteken; CHECK:       block_6:
162c172f1adSAndrew Litteken; CHECK-NEXT:    [[DIFF:%.*]] = sub i32 [[A2VAL_RELOAD]], [[B2VAL_RELOAD]]
163c172f1adSAndrew Litteken; CHECK-NEXT:    ret void
164c172f1adSAndrew Litteken; CHECK:       block_7:
165c172f1adSAndrew Litteken; CHECK-NEXT:    [[QUOT:%.*]] = udiv i32 [[AVAL_RELOAD]], [[BVAL_RELOAD]]
166c172f1adSAndrew Litteken; CHECK-NEXT:    ret void
167c172f1adSAndrew Litteken;
168c172f1adSAndrew Litteken;
169c172f1adSAndrew Litteken; CHECK: define internal i1 @outlined_ir_func_0(
170c172f1adSAndrew Litteken; CHECK-NEXT:  newFuncRoot:
171c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2_TO_OUTLINE:%.*]]
172c172f1adSAndrew Litteken; CHECK:       block_2_to_outline:
173*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
174*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4
17581d3ac0cSAndrew Litteken; CHECK-NEXT:    [[ADD2:%.*]] = add i32 2, [[A2VAL]]
17681d3ac0cSAndrew Litteken; CHECK-NEXT:    [[MUL2:%.*]] = mul i32 2, [[B2VAL]]
17781d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_5:%.*]]
17881d3ac0cSAndrew Litteken; CHECK:       block_3:
179*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4
180*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4
18181d3ac0cSAndrew Litteken; CHECK-NEXT:    [[ADD:%.*]] = add i32 2, [[AVAL]]
18281d3ac0cSAndrew Litteken; CHECK-NEXT:    [[MUL:%.*]] = mul i32 2, [[BVAL]]
18381d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_4:%.*]]
18481d3ac0cSAndrew Litteken; CHECK:       block_4:
185*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[TMP2:%.*]], align 4
186*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL]], ptr [[TMP3:%.*]], align 4
187c172f1adSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6_EXITSTUB:%.*]]
18881d3ac0cSAndrew Litteken; CHECK:       block_5:
189*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD2]], ptr [[TMP2]], align 4
190*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL2]], ptr [[TMP3]], align 4
19181d3ac0cSAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_7_EXITSTUB:%.*]]
192c172f1adSAndrew Litteken; CHECK:       block_6.exitStub:
193*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[AVAL]], ptr [[TMP6:%.*]], align 4
194*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[BVAL]], ptr [[TMP7:%.*]], align 4
195c172f1adSAndrew Litteken; CHECK-NEXT:    ret i1 true
19681d3ac0cSAndrew Litteken; CHECK:       block_7.exitStub:
197*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[A2VAL]], ptr [[TMP4:%.*]], align 4
198*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[B2VAL]], ptr [[TMP5:%.*]], align 4
199c172f1adSAndrew Litteken; CHECK-NEXT:    ret i1 false
20081d3ac0cSAndrew Litteken;
201