[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / ARM / phi-eliminate.ll
blob8a36226851592a0a345b227c4d88823d22ca9cc2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -mtriple=thumbv8m.main < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -two-entry-phi-node-folding-threshold=4 | FileCheck %s --check-prefixes=CHECK-TWO-FOLD-4,CHECK-V8M-TWO-FOLD-4
3 ; RUN: opt -mtriple=armv8a < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -two-entry-phi-node-folding-threshold=4 | FileCheck %s --check-prefixes=CHECK-TWO-FOLD-4,CHECK-V8A-TWO-FOLD-4
4 ; RUN: opt -mtriple=thumbv8m.main < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -two-entry-phi-node-folding-threshold=5 | FileCheck %s --check-prefixes=CHECK-TWO-FOLD-5,CHECK-V8M-TWO-FOLD-5
5 ; RUN: opt -mtriple=armv8a < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -two-entry-phi-node-folding-threshold=5 | FileCheck %s --check-prefixes=CHECK-TWO-FOLD-5,CHECK-V8A-TWO-FOLD-5
6 ; RUN: opt -mtriple=thumbv8m.main < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -two-entry-phi-node-folding-threshold=6 | FileCheck %s --check-prefixes=CHECK-TWO-FOLD-6,CHECK-V8M-TWO-FOLD-6
7 ; RUN: opt -mtriple=armv8a < %s -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -S -two-entry-phi-node-folding-threshold=6 | FileCheck %s --check-prefixes=CHECK-TWO-FOLD-6,CHECK-V8A-TWO-FOLD-6
9 define i32 @test_i32(i1 %a, i1 %b, i32 %i, i32 %j, i32 %k) {
10 ; CHECK-TWO-FOLD-4-LABEL: @test_i32(
11 ; CHECK-TWO-FOLD-4-NEXT:  entry:
12 ; CHECK-TWO-FOLD-4-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
13 ; CHECK-TWO-FOLD-4:       O:
14 ; CHECK-TWO-FOLD-4-NEXT:    [[IAJ:%.*]] = add i32 [[I:%.*]], [[J:%.*]]
15 ; CHECK-TWO-FOLD-4-NEXT:    [[IAJAK:%.*]] = add i32 [[IAJ]], [[K:%.*]]
16 ; CHECK-TWO-FOLD-4-NEXT:    [[IXJ:%.*]] = xor i32 [[I]], [[J]]
17 ; CHECK-TWO-FOLD-4-NEXT:    [[IXJXK:%.*]] = xor i32 [[IXJ]], [[K]]
18 ; CHECK-TWO-FOLD-4-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i32 [[IAJAK]], i32 [[IXJXK]]
19 ; CHECK-TWO-FOLD-4-NEXT:    [[WP2:%.*]] = add i32 [[WP]], [[WP]]
20 ; CHECK-TWO-FOLD-4-NEXT:    br label [[M]]
21 ; CHECK-TWO-FOLD-4:       M:
22 ; CHECK-TWO-FOLD-4-NEXT:    [[W:%.*]] = phi i32 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
23 ; CHECK-TWO-FOLD-4-NEXT:    [[R:%.*]] = add i32 [[W]], 1
24 ; CHECK-TWO-FOLD-4-NEXT:    ret i32 [[R]]
26 ; CHECK-TWO-FOLD-5-LABEL: @test_i32(
27 ; CHECK-TWO-FOLD-5-NEXT:  entry:
28 ; CHECK-TWO-FOLD-5-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
29 ; CHECK-TWO-FOLD-5:       O:
30 ; CHECK-TWO-FOLD-5-NEXT:    [[IAJ:%.*]] = add i32 [[I:%.*]], [[J:%.*]]
31 ; CHECK-TWO-FOLD-5-NEXT:    [[IAJAK:%.*]] = add i32 [[IAJ]], [[K:%.*]]
32 ; CHECK-TWO-FOLD-5-NEXT:    [[IXJ:%.*]] = xor i32 [[I]], [[J]]
33 ; CHECK-TWO-FOLD-5-NEXT:    [[IXJXK:%.*]] = xor i32 [[IXJ]], [[K]]
34 ; CHECK-TWO-FOLD-5-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i32 [[IAJAK]], i32 [[IXJXK]]
35 ; CHECK-TWO-FOLD-5-NEXT:    [[WP2:%.*]] = add i32 [[WP]], [[WP]]
36 ; CHECK-TWO-FOLD-5-NEXT:    br label [[M]]
37 ; CHECK-TWO-FOLD-5:       M:
38 ; CHECK-TWO-FOLD-5-NEXT:    [[W:%.*]] = phi i32 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
39 ; CHECK-TWO-FOLD-5-NEXT:    [[R:%.*]] = add i32 [[W]], 1
40 ; CHECK-TWO-FOLD-5-NEXT:    ret i32 [[R]]
42 ; CHECK-TWO-FOLD-6-LABEL: @test_i32(
43 ; CHECK-TWO-FOLD-6-NEXT:  entry:
44 ; CHECK-TWO-FOLD-6-NEXT:    [[IAJ:%.*]] = add i32 [[I:%.*]], [[J:%.*]]
45 ; CHECK-TWO-FOLD-6-NEXT:    [[IAJAK:%.*]] = add i32 [[IAJ]], [[K:%.*]]
46 ; CHECK-TWO-FOLD-6-NEXT:    [[IXJ:%.*]] = xor i32 [[I]], [[J]]
47 ; CHECK-TWO-FOLD-6-NEXT:    [[IXJXK:%.*]] = xor i32 [[IXJ]], [[K]]
48 ; CHECK-TWO-FOLD-6-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i32 [[IAJAK]], i32 [[IXJXK]]
49 ; CHECK-TWO-FOLD-6-NEXT:    [[WP2:%.*]] = add i32 [[WP]], [[WP]]
50 ; CHECK-TWO-FOLD-6-NEXT:    [[W:%.*]] = select i1 [[A:%.*]], i32 2, i32 [[WP2]]
51 ; CHECK-TWO-FOLD-6-NEXT:    [[R:%.*]] = add i32 [[W]], 1
52 ; CHECK-TWO-FOLD-6-NEXT:    ret i32 [[R]]
54 entry:
55   br i1 %a, label %M, label %O
57   br i1 %b, label %P, label %Q
59   %iaj = add i32 %i, %j
60   %iajak = add i32 %iaj, %k
61   br label %N
63   %ixj = xor i32 %i, %j
64   %ixjxk = xor i32 %ixj, %k
65   br label %N
67   %Wp = phi i32 [ %iajak, %P ], [ %ixjxk, %Q ]
68   %Wp2 = add i32 %Wp, %Wp
69   br label %M
71   %W = phi i32 [ %Wp2, %N ], [ 2, %entry ]
72   %R = add i32 %W, 1
73   ret i32 %R
76 define i32 @test_i32_minsize(i1 %a, i1 %b, i32 %i, i32 %j, i32 %k) #0 {
77 ; CHECK-TWO-FOLD-4-LABEL: @test_i32_minsize(
78 ; CHECK-TWO-FOLD-4-NEXT:  entry:
79 ; CHECK-TWO-FOLD-4-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
80 ; CHECK-TWO-FOLD-4:       O:
81 ; CHECK-TWO-FOLD-4-NEXT:    [[IAJ:%.*]] = add i32 [[I:%.*]], [[J:%.*]]
82 ; CHECK-TWO-FOLD-4-NEXT:    [[IAJAK:%.*]] = add i32 [[IAJ]], [[K:%.*]]
83 ; CHECK-TWO-FOLD-4-NEXT:    [[IXJ:%.*]] = xor i32 [[I]], [[J]]
84 ; CHECK-TWO-FOLD-4-NEXT:    [[IXJXK:%.*]] = xor i32 [[IXJ]], [[K]]
85 ; CHECK-TWO-FOLD-4-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i32 [[IAJAK]], i32 [[IXJXK]]
86 ; CHECK-TWO-FOLD-4-NEXT:    [[WP2:%.*]] = add i32 [[WP]], [[WP]]
87 ; CHECK-TWO-FOLD-4-NEXT:    br label [[M]]
88 ; CHECK-TWO-FOLD-4:       M:
89 ; CHECK-TWO-FOLD-4-NEXT:    [[W:%.*]] = phi i32 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
90 ; CHECK-TWO-FOLD-4-NEXT:    [[R:%.*]] = add i32 [[W]], 1
91 ; CHECK-TWO-FOLD-4-NEXT:    ret i32 [[R]]
93 ; CHECK-TWO-FOLD-5-LABEL: @test_i32_minsize(
94 ; CHECK-TWO-FOLD-5-NEXT:  entry:
95 ; CHECK-TWO-FOLD-5-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
96 ; CHECK-TWO-FOLD-5:       O:
97 ; CHECK-TWO-FOLD-5-NEXT:    [[IAJ:%.*]] = add i32 [[I:%.*]], [[J:%.*]]
98 ; CHECK-TWO-FOLD-5-NEXT:    [[IAJAK:%.*]] = add i32 [[IAJ]], [[K:%.*]]
99 ; CHECK-TWO-FOLD-5-NEXT:    [[IXJ:%.*]] = xor i32 [[I]], [[J]]
100 ; CHECK-TWO-FOLD-5-NEXT:    [[IXJXK:%.*]] = xor i32 [[IXJ]], [[K]]
101 ; CHECK-TWO-FOLD-5-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i32 [[IAJAK]], i32 [[IXJXK]]
102 ; CHECK-TWO-FOLD-5-NEXT:    [[WP2:%.*]] = add i32 [[WP]], [[WP]]
103 ; CHECK-TWO-FOLD-5-NEXT:    br label [[M]]
104 ; CHECK-TWO-FOLD-5:       M:
105 ; CHECK-TWO-FOLD-5-NEXT:    [[W:%.*]] = phi i32 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
106 ; CHECK-TWO-FOLD-5-NEXT:    [[R:%.*]] = add i32 [[W]], 1
107 ; CHECK-TWO-FOLD-5-NEXT:    ret i32 [[R]]
109 ; CHECK-TWO-FOLD-6-LABEL: @test_i32_minsize(
110 ; CHECK-TWO-FOLD-6-NEXT:  entry:
111 ; CHECK-TWO-FOLD-6-NEXT:    [[IAJ:%.*]] = add i32 [[I:%.*]], [[J:%.*]]
112 ; CHECK-TWO-FOLD-6-NEXT:    [[IAJAK:%.*]] = add i32 [[IAJ]], [[K:%.*]]
113 ; CHECK-TWO-FOLD-6-NEXT:    [[IXJ:%.*]] = xor i32 [[I]], [[J]]
114 ; CHECK-TWO-FOLD-6-NEXT:    [[IXJXK:%.*]] = xor i32 [[IXJ]], [[K]]
115 ; CHECK-TWO-FOLD-6-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i32 [[IAJAK]], i32 [[IXJXK]]
116 ; CHECK-TWO-FOLD-6-NEXT:    [[WP2:%.*]] = add i32 [[WP]], [[WP]]
117 ; CHECK-TWO-FOLD-6-NEXT:    [[W:%.*]] = select i1 [[A:%.*]], i32 2, i32 [[WP2]]
118 ; CHECK-TWO-FOLD-6-NEXT:    [[R:%.*]] = add i32 [[W]], 1
119 ; CHECK-TWO-FOLD-6-NEXT:    ret i32 [[R]]
121 entry:
122   br i1 %a, label %M, label %O
124   br i1 %b, label %P, label %Q
126   %iaj = add i32 %i, %j
127   %iajak = add i32 %iaj, %k
128   br label %N
130   %ixj = xor i32 %i, %j
131   %ixjxk = xor i32 %ixj, %k
132   br label %N
134   %Wp = phi i32 [ %iajak, %P ], [ %ixjxk, %Q ]
135   %Wp2 = add i32 %Wp, %Wp
136   br label %M
138   %W = phi i32 [ %Wp2, %N ], [ 2, %entry ]
139   %R = add i32 %W, 1
140   ret i32 %R
143 define i64 @test_i64(i1 %a, i1 %b, i64 %i, i64 %j, i64 %k) {
144 ; CHECK-V8M-TWO-FOLD-4-LABEL: @test_i64(
145 ; CHECK-V8M-TWO-FOLD-4-NEXT:  entry:
146 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
147 ; CHECK-V8M-TWO-FOLD-4:       O:
148 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br i1 [[B:%.*]], label [[P:%.*]], label [[Q:%.*]]
149 ; CHECK-V8M-TWO-FOLD-4:       P:
150 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
151 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
152 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br label [[N:%.*]]
153 ; CHECK-V8M-TWO-FOLD-4:       Q:
154 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
155 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
156 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br label [[N]]
157 ; CHECK-V8M-TWO-FOLD-4:       N:
158 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[WP:%.*]] = phi i64 [ [[IAJAK]], [[P]] ], [ [[IXJXK]], [[Q]] ]
159 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
160 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br label [[M]]
161 ; CHECK-V8M-TWO-FOLD-4:       M:
162 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[N]] ], [ 2, [[ENTRY:%.*]] ]
163 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[R:%.*]] = add i64 [[W]], 1
164 ; CHECK-V8M-TWO-FOLD-4-NEXT:    ret i64 [[R]]
166 ; CHECK-V8A-TWO-FOLD-4-LABEL: @test_i64(
167 ; CHECK-V8A-TWO-FOLD-4-NEXT:  entry:
168 ; CHECK-V8A-TWO-FOLD-4-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
169 ; CHECK-V8A-TWO-FOLD-4:       O:
170 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
171 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
172 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
173 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
174 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i64 [[IAJAK]], i64 [[IXJXK]]
175 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
176 ; CHECK-V8A-TWO-FOLD-4-NEXT:    br label [[M]]
177 ; CHECK-V8A-TWO-FOLD-4:       M:
178 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
179 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[R:%.*]] = add i64 [[W]], 1
180 ; CHECK-V8A-TWO-FOLD-4-NEXT:    ret i64 [[R]]
182 ; CHECK-V8M-TWO-FOLD-5-LABEL: @test_i64(
183 ; CHECK-V8M-TWO-FOLD-5-NEXT:  entry:
184 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
185 ; CHECK-V8M-TWO-FOLD-5:       O:
186 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br i1 [[B:%.*]], label [[P:%.*]], label [[Q:%.*]]
187 ; CHECK-V8M-TWO-FOLD-5:       P:
188 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
189 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
190 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br label [[N:%.*]]
191 ; CHECK-V8M-TWO-FOLD-5:       Q:
192 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
193 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
194 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br label [[N]]
195 ; CHECK-V8M-TWO-FOLD-5:       N:
196 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[WP:%.*]] = phi i64 [ [[IAJAK]], [[P]] ], [ [[IXJXK]], [[Q]] ]
197 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
198 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br label [[M]]
199 ; CHECK-V8M-TWO-FOLD-5:       M:
200 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[N]] ], [ 2, [[ENTRY:%.*]] ]
201 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[R:%.*]] = add i64 [[W]], 1
202 ; CHECK-V8M-TWO-FOLD-5-NEXT:    ret i64 [[R]]
204 ; CHECK-V8A-TWO-FOLD-5-LABEL: @test_i64(
205 ; CHECK-V8A-TWO-FOLD-5-NEXT:  entry:
206 ; CHECK-V8A-TWO-FOLD-5-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
207 ; CHECK-V8A-TWO-FOLD-5:       O:
208 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
209 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
210 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
211 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
212 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i64 [[IAJAK]], i64 [[IXJXK]]
213 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
214 ; CHECK-V8A-TWO-FOLD-5-NEXT:    br label [[M]]
215 ; CHECK-V8A-TWO-FOLD-5:       M:
216 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
217 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[R:%.*]] = add i64 [[W]], 1
218 ; CHECK-V8A-TWO-FOLD-5-NEXT:    ret i64 [[R]]
220 ; CHECK-V8M-TWO-FOLD-6-LABEL: @test_i64(
221 ; CHECK-V8M-TWO-FOLD-6-NEXT:  entry:
222 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
223 ; CHECK-V8M-TWO-FOLD-6:       O:
224 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br i1 [[B:%.*]], label [[P:%.*]], label [[Q:%.*]]
225 ; CHECK-V8M-TWO-FOLD-6:       P:
226 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
227 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
228 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br label [[N:%.*]]
229 ; CHECK-V8M-TWO-FOLD-6:       Q:
230 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
231 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
232 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br label [[N]]
233 ; CHECK-V8M-TWO-FOLD-6:       N:
234 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[WP:%.*]] = phi i64 [ [[IAJAK]], [[P]] ], [ [[IXJXK]], [[Q]] ]
235 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
236 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br label [[M]]
237 ; CHECK-V8M-TWO-FOLD-6:       M:
238 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[N]] ], [ 2, [[ENTRY:%.*]] ]
239 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[R:%.*]] = add i64 [[W]], 1
240 ; CHECK-V8M-TWO-FOLD-6-NEXT:    ret i64 [[R]]
242 ; CHECK-V8A-TWO-FOLD-6-LABEL: @test_i64(
243 ; CHECK-V8A-TWO-FOLD-6-NEXT:  entry:
244 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
245 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
246 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
247 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
248 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i64 [[IAJAK]], i64 [[IXJXK]]
249 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
250 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[W:%.*]] = select i1 [[A:%.*]], i64 2, i64 [[WP2]]
251 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[R:%.*]] = add i64 [[W]], 1
252 ; CHECK-V8A-TWO-FOLD-6-NEXT:    ret i64 [[R]]
254 entry:
255   br i1 %a, label %M, label %O
257   br i1 %b, label %P, label %Q
259   %iaj = add i64 %i, %j
260   %iajak = add i64 %iaj, %k
261   br label %N
263   %ixj = xor i64 %i, %j
264   %ixjxk = xor i64 %ixj, %k
265   br label %N
267   %Wp = phi i64 [ %iajak, %P ], [ %ixjxk, %Q ]
268   %Wp2 = add i64 %Wp, %Wp
269   br label %M
271   %W = phi i64 [ %Wp2, %N ], [ 2, %entry ]
272   %R = add i64 %W, 1
273   ret i64 %R
276 define i64 @test_i64_minsize(i1 %a, i1 %b, i64 %i, i64 %j, i64 %k) #0 {
277 ; CHECK-V8M-TWO-FOLD-4-LABEL: @test_i64_minsize(
278 ; CHECK-V8M-TWO-FOLD-4-NEXT:  entry:
279 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
280 ; CHECK-V8M-TWO-FOLD-4:       O:
281 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br i1 [[B:%.*]], label [[P:%.*]], label [[Q:%.*]]
282 ; CHECK-V8M-TWO-FOLD-4:       P:
283 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
284 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
285 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br label [[N:%.*]]
286 ; CHECK-V8M-TWO-FOLD-4:       Q:
287 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
288 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
289 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br label [[N]]
290 ; CHECK-V8M-TWO-FOLD-4:       N:
291 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[WP:%.*]] = phi i64 [ [[IAJAK]], [[P]] ], [ [[IXJXK]], [[Q]] ]
292 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
293 ; CHECK-V8M-TWO-FOLD-4-NEXT:    br label [[M]]
294 ; CHECK-V8M-TWO-FOLD-4:       M:
295 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[N]] ], [ 2, [[ENTRY:%.*]] ]
296 ; CHECK-V8M-TWO-FOLD-4-NEXT:    [[R:%.*]] = add i64 [[W]], 1
297 ; CHECK-V8M-TWO-FOLD-4-NEXT:    ret i64 [[R]]
299 ; CHECK-V8A-TWO-FOLD-4-LABEL: @test_i64_minsize(
300 ; CHECK-V8A-TWO-FOLD-4-NEXT:  entry:
301 ; CHECK-V8A-TWO-FOLD-4-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
302 ; CHECK-V8A-TWO-FOLD-4:       O:
303 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
304 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
305 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
306 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
307 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i64 [[IAJAK]], i64 [[IXJXK]]
308 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
309 ; CHECK-V8A-TWO-FOLD-4-NEXT:    br label [[M]]
310 ; CHECK-V8A-TWO-FOLD-4:       M:
311 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
312 ; CHECK-V8A-TWO-FOLD-4-NEXT:    [[R:%.*]] = add i64 [[W]], 1
313 ; CHECK-V8A-TWO-FOLD-4-NEXT:    ret i64 [[R]]
315 ; CHECK-V8M-TWO-FOLD-5-LABEL: @test_i64_minsize(
316 ; CHECK-V8M-TWO-FOLD-5-NEXT:  entry:
317 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
318 ; CHECK-V8M-TWO-FOLD-5:       O:
319 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br i1 [[B:%.*]], label [[P:%.*]], label [[Q:%.*]]
320 ; CHECK-V8M-TWO-FOLD-5:       P:
321 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
322 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
323 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br label [[N:%.*]]
324 ; CHECK-V8M-TWO-FOLD-5:       Q:
325 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
326 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
327 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br label [[N]]
328 ; CHECK-V8M-TWO-FOLD-5:       N:
329 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[WP:%.*]] = phi i64 [ [[IAJAK]], [[P]] ], [ [[IXJXK]], [[Q]] ]
330 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
331 ; CHECK-V8M-TWO-FOLD-5-NEXT:    br label [[M]]
332 ; CHECK-V8M-TWO-FOLD-5:       M:
333 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[N]] ], [ 2, [[ENTRY:%.*]] ]
334 ; CHECK-V8M-TWO-FOLD-5-NEXT:    [[R:%.*]] = add i64 [[W]], 1
335 ; CHECK-V8M-TWO-FOLD-5-NEXT:    ret i64 [[R]]
337 ; CHECK-V8A-TWO-FOLD-5-LABEL: @test_i64_minsize(
338 ; CHECK-V8A-TWO-FOLD-5-NEXT:  entry:
339 ; CHECK-V8A-TWO-FOLD-5-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
340 ; CHECK-V8A-TWO-FOLD-5:       O:
341 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
342 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
343 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
344 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
345 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i64 [[IAJAK]], i64 [[IXJXK]]
346 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
347 ; CHECK-V8A-TWO-FOLD-5-NEXT:    br label [[M]]
348 ; CHECK-V8A-TWO-FOLD-5:       M:
349 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[O]] ], [ 2, [[ENTRY:%.*]] ]
350 ; CHECK-V8A-TWO-FOLD-5-NEXT:    [[R:%.*]] = add i64 [[W]], 1
351 ; CHECK-V8A-TWO-FOLD-5-NEXT:    ret i64 [[R]]
353 ; CHECK-V8M-TWO-FOLD-6-LABEL: @test_i64_minsize(
354 ; CHECK-V8M-TWO-FOLD-6-NEXT:  entry:
355 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br i1 [[A:%.*]], label [[M:%.*]], label [[O:%.*]]
356 ; CHECK-V8M-TWO-FOLD-6:       O:
357 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br i1 [[B:%.*]], label [[P:%.*]], label [[Q:%.*]]
358 ; CHECK-V8M-TWO-FOLD-6:       P:
359 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
360 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
361 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br label [[N:%.*]]
362 ; CHECK-V8M-TWO-FOLD-6:       Q:
363 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
364 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
365 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br label [[N]]
366 ; CHECK-V8M-TWO-FOLD-6:       N:
367 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[WP:%.*]] = phi i64 [ [[IAJAK]], [[P]] ], [ [[IXJXK]], [[Q]] ]
368 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
369 ; CHECK-V8M-TWO-FOLD-6-NEXT:    br label [[M]]
370 ; CHECK-V8M-TWO-FOLD-6:       M:
371 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[W:%.*]] = phi i64 [ [[WP2]], [[N]] ], [ 2, [[ENTRY:%.*]] ]
372 ; CHECK-V8M-TWO-FOLD-6-NEXT:    [[R:%.*]] = add i64 [[W]], 1
373 ; CHECK-V8M-TWO-FOLD-6-NEXT:    ret i64 [[R]]
375 ; CHECK-V8A-TWO-FOLD-6-LABEL: @test_i64_minsize(
376 ; CHECK-V8A-TWO-FOLD-6-NEXT:  entry:
377 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IAJ:%.*]] = add i64 [[I:%.*]], [[J:%.*]]
378 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IAJAK:%.*]] = add i64 [[IAJ]], [[K:%.*]]
379 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IXJ:%.*]] = xor i64 [[I]], [[J]]
380 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[IXJXK:%.*]] = xor i64 [[IXJ]], [[K]]
381 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[WP:%.*]] = select i1 [[B:%.*]], i64 [[IAJAK]], i64 [[IXJXK]]
382 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[WP2:%.*]] = add i64 [[WP]], [[WP]]
383 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[W:%.*]] = select i1 [[A:%.*]], i64 2, i64 [[WP2]]
384 ; CHECK-V8A-TWO-FOLD-6-NEXT:    [[R:%.*]] = add i64 [[W]], 1
385 ; CHECK-V8A-TWO-FOLD-6-NEXT:    ret i64 [[R]]
387 entry:
388   br i1 %a, label %M, label %O
390   br i1 %b, label %P, label %Q
392   %iaj = add i64 %i, %j
393   %iajak = add i64 %iaj, %k
394   br label %N
396   %ixj = xor i64 %i, %j
397   %ixjxk = xor i64 %ixj, %k
398   br label %N
400   %Wp = phi i64 [ %iajak, %P ], [ %ixjxk, %Q ]
401   %Wp2 = add i64 %Wp, %Wp
402   br label %M
404   %W = phi i64 [ %Wp2, %N ], [ 2, %entry ]
405   %R = add i64 %W, 1
406   ret i64 %R
409 attributes #0 = { minsize optsize }