xref: /llvm-project/llvm/test/Transforms/IROutliner/outlining-branches-phi-nodes.ll (revision f4b925ee7078f058602fd323e25f45f1ae91ca34)
1dcc3e728SAndrew 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
3dcc3e728SAndrew Litteken
4dcc3e728SAndrew Litteken; Here we have multiple exits, but the different sources, same outputs are
5dcc3e728SAndrew Litteken; needed, this checks that they are compressed, and moved into the appropriate
6dcc3e728SAndrew Litteken; output blocks.
7dcc3e728SAndrew Litteken
8dcc3e728SAndrew Littekendefine void @outline_outputs1() #0 {
9dcc3e728SAndrew Littekenentry:
10dcc3e728SAndrew Litteken  %output = alloca i32, align 4
11dcc3e728SAndrew Litteken  %result = alloca i32, align 4
12dcc3e728SAndrew Litteken  %output2 = alloca i32, align 4
13dcc3e728SAndrew Litteken  %result2 = alloca i32, align 4
14dcc3e728SAndrew Litteken  %a = alloca i32, align 4
15dcc3e728SAndrew Litteken  %b = alloca i32, align 4
16dcc3e728SAndrew Litteken  br label %block_2
17dcc3e728SAndrew Littekenblock_1:
18dcc3e728SAndrew Litteken  %a2 = alloca i32, align 4
19dcc3e728SAndrew Litteken  %b2 = alloca i32, align 4
20dcc3e728SAndrew Litteken  br label %block_2
21dcc3e728SAndrew Littekenblock_2:
22*f4b925eeSMatt Arsenault  %a2val = load i32, ptr %a
23*f4b925eeSMatt Arsenault  %b2val = load i32, ptr %b
24dcc3e728SAndrew Litteken  %add2 = add i32 2, %a2val
25dcc3e728SAndrew Litteken  %mul2 = mul i32 2, %b2val
26dcc3e728SAndrew Litteken  br label %block_5
27dcc3e728SAndrew Littekenblock_3:
28*f4b925eeSMatt Arsenault  %aval = load i32, ptr %a
29*f4b925eeSMatt Arsenault  %bval = load i32, ptr %b
30dcc3e728SAndrew Litteken  %add = add i32 2, %aval
31dcc3e728SAndrew Litteken  %mul = mul i32 2, %bval
32dcc3e728SAndrew Litteken  br label %block_4
33dcc3e728SAndrew Littekenblock_4:
34*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
35*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
36dcc3e728SAndrew Litteken  br label %block_6
37dcc3e728SAndrew Littekenblock_5:
38*f4b925eeSMatt Arsenault  store i32 %add2, ptr %output, align 4
39*f4b925eeSMatt Arsenault  store i32 %mul2, ptr %result, align 4
40dcc3e728SAndrew Litteken  br label %block_6
41e8f4e41bSAndrew Littekendummy:
42e8f4e41bSAndrew Litteken  ret void
43dcc3e728SAndrew Littekenblock_6:
44dcc3e728SAndrew Litteken  %diff = phi i32 [%aval, %block_4], [%a2val, %block_5]
45dcc3e728SAndrew Litteken  ret void
46dcc3e728SAndrew Litteken}
47dcc3e728SAndrew Litteken
48dcc3e728SAndrew Littekendefine void @outline_outputs2() #0 {
49dcc3e728SAndrew Littekenentry:
50dcc3e728SAndrew Litteken  %output = alloca i32, align 4
51dcc3e728SAndrew Litteken  %result = alloca i32, align 4
52dcc3e728SAndrew Litteken  %output2 = alloca i32, align 4
53dcc3e728SAndrew Litteken  %result2 = alloca i32, align 4
54dcc3e728SAndrew Litteken  %a = alloca i32, align 4
55dcc3e728SAndrew Litteken  %b = alloca i32, align 4
56dcc3e728SAndrew Litteken  br label %block_2
57dcc3e728SAndrew Littekenblock_1:
58dcc3e728SAndrew Litteken  %a2 = alloca i32, align 4
59dcc3e728SAndrew Litteken  %b2 = alloca i32, align 4
60dcc3e728SAndrew Litteken  br label %block_2
61dcc3e728SAndrew Littekenblock_2:
62*f4b925eeSMatt Arsenault  %a2val = load i32, ptr %a
63*f4b925eeSMatt Arsenault  %b2val = load i32, ptr %b
64dcc3e728SAndrew Litteken  %add2 = add i32 2, %a2val
65dcc3e728SAndrew Litteken  %mul2 = mul i32 2, %b2val
66dcc3e728SAndrew Litteken  br label %block_5
67dcc3e728SAndrew Littekenblock_3:
68*f4b925eeSMatt Arsenault  %aval = load i32, ptr %a
69*f4b925eeSMatt Arsenault  %bval = load i32, ptr %b
70dcc3e728SAndrew Litteken  %add = add i32 2, %aval
71dcc3e728SAndrew Litteken  %mul = mul i32 2, %bval
72dcc3e728SAndrew Litteken  br label %block_4
73dcc3e728SAndrew Littekenblock_4:
74*f4b925eeSMatt Arsenault  store i32 %add, ptr %output, align 4
75*f4b925eeSMatt Arsenault  store i32 %mul, ptr %result, align 4
76dcc3e728SAndrew Litteken  br label %block_6
77dcc3e728SAndrew Littekenblock_5:
78*f4b925eeSMatt Arsenault  store i32 %add2, ptr %output, align 4
79*f4b925eeSMatt Arsenault  store i32 %mul2, ptr %result, align 4
80dcc3e728SAndrew Litteken  br label %block_6
81e8f4e41bSAndrew Littekendummy:
82e8f4e41bSAndrew Litteken  ret void
83dcc3e728SAndrew Littekenblock_6:
84dcc3e728SAndrew Litteken  %diff = phi i32 [%aval, %block_4], [%a2val, %block_5]
85dcc3e728SAndrew Litteken  ret void
86dcc3e728SAndrew Litteken}
87dcc3e728SAndrew Litteken
88dcc3e728SAndrew Litteken; CHECK-LABEL: @outline_outputs1(
89dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
90dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DIFF_CE_LOC:%.*]] = alloca i32, align 4
91dcc3e728SAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
92dcc3e728SAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
93dcc3e728SAndrew Litteken; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4
94dcc3e728SAndrew Litteken; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4
95dcc3e728SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
96dcc3e728SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
97dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2:%.*]]
98dcc3e728SAndrew Litteken; CHECK:       block_1:
99dcc3e728SAndrew Litteken; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4
100dcc3e728SAndrew Litteken; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4
101dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2]]
102dcc3e728SAndrew Litteken; CHECK:       block_2:
103*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DIFF_CE_LOC]])
104*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[DIFF_CE_LOC]])
105*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DIFF_CE_RELOAD:%.*]] = load i32, ptr [[DIFF_CE_LOC]], align 4
106*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DIFF_CE_LOC]])
107dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6:%.*]]
108e8f4e41bSAndrew Litteken; CHECK: dummy:
109e8f4e41bSAndrew Litteken; CHECK-NEXT:  ret void
110dcc3e728SAndrew Litteken; CHECK:       block_6:
111dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DIFF:%.*]] = phi i32 [ [[DIFF_CE_RELOAD]], [[BLOCK_2]] ]
112dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
113dcc3e728SAndrew Litteken;
114dcc3e728SAndrew Litteken;
115dcc3e728SAndrew Litteken; CHECK-LABEL: @outline_outputs2(
116dcc3e728SAndrew Litteken; CHECK-NEXT:  entry:
117dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DIFF_CE_LOC:%.*]] = alloca i32, align 4
118dcc3e728SAndrew Litteken; CHECK-NEXT:    [[OUTPUT:%.*]] = alloca i32, align 4
119dcc3e728SAndrew Litteken; CHECK-NEXT:    [[RESULT:%.*]] = alloca i32, align 4
120dcc3e728SAndrew Litteken; CHECK-NEXT:    [[OUTPUT2:%.*]] = alloca i32, align 4
121dcc3e728SAndrew Litteken; CHECK-NEXT:    [[RESULT2:%.*]] = alloca i32, align 4
122dcc3e728SAndrew Litteken; CHECK-NEXT:    [[A:%.*]] = alloca i32, align 4
123dcc3e728SAndrew Litteken; CHECK-NEXT:    [[B:%.*]] = alloca i32, align 4
124dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2:%.*]]
125dcc3e728SAndrew Litteken; CHECK:       block_1:
126dcc3e728SAndrew Litteken; CHECK-NEXT:    [[A2:%.*]] = alloca i32, align 4
127dcc3e728SAndrew Litteken; CHECK-NEXT:    [[B2:%.*]] = alloca i32, align 4
128dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2]]
129dcc3e728SAndrew Litteken; CHECK:       block_2:
130*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.start.p0(i64 -1, ptr [[DIFF_CE_LOC]])
131*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @outlined_ir_func_0(ptr [[A]], ptr [[B]], ptr [[OUTPUT]], ptr [[RESULT]], ptr [[DIFF_CE_LOC]])
132*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[DIFF_CE_RELOAD:%.*]] = load i32, ptr [[DIFF_CE_LOC]], align 4
133*f4b925eeSMatt Arsenault; CHECK-NEXT:    call void @llvm.lifetime.end.p0(i64 -1, ptr [[DIFF_CE_LOC]])
134dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6:%.*]]
135e8f4e41bSAndrew Litteken; CHECK: dummy:
136e8f4e41bSAndrew Litteken; CHECK-NEXT:  ret void
137dcc3e728SAndrew Litteken; CHECK:       block_6:
138dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DIFF:%.*]] = phi i32 [ [[DIFF_CE_RELOAD]], [[BLOCK_2]] ]
139dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
140dcc3e728SAndrew Litteken;
141dcc3e728SAndrew Litteken;
142dcc3e728SAndrew Litteken; CHECK:  define internal void @outlined_ir_func_0(
143dcc3e728SAndrew Litteken; CHECK-NEXT:  newFuncRoot:
144dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_2_TO_OUTLINE:%.*]]
145dcc3e728SAndrew Litteken; CHECK:       block_2_to_outline:
146*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[A2VAL:%.*]] = load i32, ptr [[TMP0:%.*]], align 4
147*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[B2VAL:%.*]] = load i32, ptr [[TMP1:%.*]], align 4
148dcc3e728SAndrew Litteken; CHECK-NEXT:    [[ADD2:%.*]] = add i32 2, [[A2VAL]]
149dcc3e728SAndrew Litteken; CHECK-NEXT:    [[MUL2:%.*]] = mul i32 2, [[B2VAL]]
150dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_5:%.*]]
151dcc3e728SAndrew Litteken; CHECK:       block_3:
152*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[AVAL:%.*]] = load i32, ptr [[TMP0]], align 4
153*f4b925eeSMatt Arsenault; CHECK-NEXT:    [[BVAL:%.*]] = load i32, ptr [[TMP1]], align 4
154dcc3e728SAndrew Litteken; CHECK-NEXT:    [[ADD:%.*]] = add i32 2, [[AVAL]]
155dcc3e728SAndrew Litteken; CHECK-NEXT:    [[MUL:%.*]] = mul i32 2, [[BVAL]]
156dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_4:%.*]]
157dcc3e728SAndrew Litteken; CHECK:       block_4:
158*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD]], ptr [[TMP2:%.*]], align 4
159*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL]], ptr [[TMP3:%.*]], align 4
160dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6_SPLIT:%.*]]
161dcc3e728SAndrew Litteken; CHECK:       block_5:
162*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[ADD2]], ptr [[TMP2]], align 4
163*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[MUL2]], ptr [[TMP3]], align 4
164dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6_SPLIT]]
165dcc3e728SAndrew Litteken; CHECK:       block_6.split:
166dcc3e728SAndrew Litteken; CHECK-NEXT:    [[DIFF_CE:%.*]] = phi i32 [ [[AVAL]], [[BLOCK_4]] ], [ [[A2VAL]], [[BLOCK_5]] ]
167dcc3e728SAndrew Litteken; CHECK-NEXT:    br label [[BLOCK_6_EXITSTUB:%.*]]
168dcc3e728SAndrew Litteken; CHECK:       block_6.exitStub:
169*f4b925eeSMatt Arsenault; CHECK-NEXT:    store i32 [[DIFF_CE]], ptr [[TMP4:%.*]], align 4
170dcc3e728SAndrew Litteken; CHECK-NEXT:    ret void
171dcc3e728SAndrew Litteken;
172