Skip to content

Commit f19440c

Browse files
rmacnak-googleCommit Queue
authored andcommitted
[vm, compiler] Use Zicond for IfThenElse.
TEST=locally increase baseline to RVA23 Change-Id: Ib28ee2edeea087b19b2cd146134d0dcf93c3fe0e Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/465482 Commit-Queue: Ryan Macnak <[email protected]> Reviewed-by: Alexander Markov <[email protected]>
1 parent 2f8a59a commit f19440c

File tree

4 files changed

+583
-48
lines changed

4 files changed

+583
-48
lines changed
Lines changed: 386 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,386 @@
1+
// Copyright (c) 2025, the Dart project authors. Please see the AUTHORS file
2+
// for details. All rights reserved. Use of this source code is governed by a
3+
// BSD-style license that can be found in the LICENSE file.
4+
5+
// VMOptions=--optimization-counter-threshold=50 --no-background-compilation
6+
7+
import "package:expect/expect.dart";
8+
9+
@pragma("vm:never-inline")
10+
dynamic eq(dynamic x, dynamic y) => x == y ? 3 : 7;
11+
@pragma("vm:never-inline")
12+
dynamic ne(dynamic x, dynamic y) => x != y ? 3 : 7;
13+
@pragma("vm:never-inline")
14+
dynamic lt(dynamic x, dynamic y) => x < y ? 3 : 7;
15+
@pragma("vm:never-inline")
16+
dynamic le(dynamic x, dynamic y) => x <= y ? 3 : 7;
17+
@pragma("vm:never-inline")
18+
dynamic gt(dynamic x, dynamic y) => x > y ? 3 : 7;
19+
@pragma("vm:never-inline")
20+
dynamic ge(dynamic x, dynamic y) => x >= y ? 3 : 7;
21+
22+
testCompareReg() {
23+
Expect.equals(7, eq(3, 2));
24+
Expect.equals(3, eq(3, 3));
25+
Expect.equals(7, eq(3, 4));
26+
27+
Expect.equals(3, ne(3, 2));
28+
Expect.equals(7, ne(3, 3));
29+
Expect.equals(3, ne(3, 4));
30+
31+
Expect.equals(7, lt(3, 2));
32+
Expect.equals(7, lt(3, 3));
33+
Expect.equals(3, lt(3, 4));
34+
35+
Expect.equals(7, le(3, 2));
36+
Expect.equals(3, le(3, 3));
37+
Expect.equals(3, le(3, 4));
38+
39+
Expect.equals(3, gt(3, 2));
40+
Expect.equals(7, gt(3, 3));
41+
Expect.equals(7, gt(3, 4));
42+
43+
Expect.equals(3, ge(3, 2));
44+
Expect.equals(3, ge(3, 3));
45+
Expect.equals(7, ge(3, 4));
46+
}
47+
48+
@pragma("vm:never-inline")
49+
dynamic eq0(dynamic x, dynamic y) => x == y ? 1 : 0;
50+
@pragma("vm:never-inline")
51+
dynamic ne0(dynamic x, dynamic y) => x != y ? 1 : 0;
52+
@pragma("vm:never-inline")
53+
dynamic lt0(dynamic x, dynamic y) => x < y ? 1 : 0;
54+
@pragma("vm:never-inline")
55+
dynamic le0(dynamic x, dynamic y) => x <= y ? 1 : 0;
56+
@pragma("vm:never-inline")
57+
dynamic gt0(dynamic x, dynamic y) => x > y ? 1 : 0;
58+
@pragma("vm:never-inline")
59+
dynamic ge0(dynamic x, dynamic y) => x >= y ? 1 : 0;
60+
61+
testCompareReg0() {
62+
Expect.equals(0, eq0(3, 2));
63+
Expect.equals(1, eq0(3, 3));
64+
Expect.equals(0, eq0(3, 4));
65+
66+
Expect.equals(1, ne0(3, 2));
67+
Expect.equals(0, ne0(3, 3));
68+
Expect.equals(1, ne0(3, 4));
69+
70+
Expect.equals(0, lt0(3, 2));
71+
Expect.equals(0, lt0(3, 3));
72+
Expect.equals(1, lt0(3, 4));
73+
74+
Expect.equals(0, le0(3, 2));
75+
Expect.equals(1, le0(3, 3));
76+
Expect.equals(1, le0(3, 4));
77+
78+
Expect.equals(1, gt0(3, 2));
79+
Expect.equals(0, gt0(3, 3));
80+
Expect.equals(0, gt0(3, 4));
81+
82+
Expect.equals(1, ge0(3, 2));
83+
Expect.equals(1, ge0(3, 3));
84+
Expect.equals(0, ge0(3, 4));
85+
}
86+
87+
@pragma("vm:never-inline")
88+
dynamic eqN(dynamic x, dynamic y) => x == y ? 1 : 4;
89+
@pragma("vm:never-inline")
90+
dynamic neN(dynamic x, dynamic y) => x != y ? 1 : 4;
91+
@pragma("vm:never-inline")
92+
dynamic ltN(dynamic x, dynamic y) => x < y ? 1 : 4;
93+
@pragma("vm:never-inline")
94+
dynamic leN(dynamic x, dynamic y) => x <= y ? 1 : 4;
95+
@pragma("vm:never-inline")
96+
dynamic gtN(dynamic x, dynamic y) => x > y ? 1 : 4;
97+
@pragma("vm:never-inline")
98+
dynamic geN(dynamic x, dynamic y) => x >= y ? 1 : 4;
99+
100+
testCompareRegN() {
101+
Expect.equals(4, eqN(3, 2));
102+
Expect.equals(1, eqN(3, 3));
103+
Expect.equals(4, eqN(3, 4));
104+
105+
Expect.equals(1, neN(3, 2));
106+
Expect.equals(4, neN(3, 3));
107+
Expect.equals(1, neN(3, 4));
108+
109+
Expect.equals(4, ltN(3, 2));
110+
Expect.equals(4, ltN(3, 3));
111+
Expect.equals(1, ltN(3, 4));
112+
113+
Expect.equals(4, leN(3, 2));
114+
Expect.equals(1, leN(3, 3));
115+
Expect.equals(1, leN(3, 4));
116+
117+
Expect.equals(1, gtN(3, 2));
118+
Expect.equals(4, gtN(3, 3));
119+
Expect.equals(4, gtN(3, 4));
120+
121+
Expect.equals(1, geN(3, 2));
122+
Expect.equals(1, geN(3, 3));
123+
Expect.equals(4, geN(3, 4));
124+
}
125+
126+
@pragma("vm:never-inline")
127+
dynamic eqimm(dynamic x) => x == 4 ? 3 : 7;
128+
@pragma("vm:never-inline")
129+
dynamic neimm(dynamic x) => x != 4 ? 3 : 7;
130+
@pragma("vm:never-inline")
131+
dynamic ltimm(dynamic x) => x < 4 ? 3 : 7;
132+
@pragma("vm:never-inline")
133+
dynamic leimm(dynamic x) => x <= 4 ? 3 : 7;
134+
@pragma("vm:never-inline")
135+
dynamic gtimm(dynamic x) => x > 4 ? 3 : 7;
136+
@pragma("vm:never-inline")
137+
dynamic geimm(dynamic x) => x >= 4 ? 3 : 7;
138+
139+
testCompareImm() {
140+
Expect.equals(7, eqimm(3));
141+
Expect.equals(3, eqimm(4));
142+
Expect.equals(7, eqimm(5));
143+
144+
Expect.equals(3, neimm(3));
145+
Expect.equals(7, neimm(4));
146+
Expect.equals(3, neimm(5));
147+
148+
Expect.equals(3, ltimm(3));
149+
Expect.equals(7, ltimm(4));
150+
Expect.equals(7, ltimm(5));
151+
152+
Expect.equals(3, leimm(3));
153+
Expect.equals(3, leimm(4));
154+
Expect.equals(7, leimm(5));
155+
156+
Expect.equals(7, gtimm(3));
157+
Expect.equals(7, gtimm(4));
158+
Expect.equals(3, gtimm(5));
159+
160+
Expect.equals(7, geimm(3));
161+
Expect.equals(3, geimm(4));
162+
Expect.equals(3, geimm(5));
163+
}
164+
165+
@pragma("vm:never-inline")
166+
dynamic eqimm0(dynamic x) => x == 4 ? 1 : 0;
167+
@pragma("vm:never-inline")
168+
dynamic neimm0(dynamic x) => x != 4 ? 1 : 0;
169+
@pragma("vm:never-inline")
170+
dynamic ltimm0(dynamic x) => x < 4 ? 1 : 0;
171+
@pragma("vm:never-inline")
172+
dynamic leimm0(dynamic x) => x <= 4 ? 1 : 0;
173+
@pragma("vm:never-inline")
174+
dynamic gtimm0(dynamic x) => x > 4 ? 1 : 0;
175+
@pragma("vm:never-inline")
176+
dynamic geimm0(dynamic x) => x >= 4 ? 1 : 0;
177+
178+
testCompareImm0() {
179+
Expect.equals(0, eqimm0(3));
180+
Expect.equals(1, eqimm0(4));
181+
Expect.equals(0, eqimm0(5));
182+
183+
Expect.equals(1, neimm0(3));
184+
Expect.equals(0, neimm0(4));
185+
Expect.equals(1, neimm0(5));
186+
187+
Expect.equals(1, ltimm0(3));
188+
Expect.equals(0, ltimm0(4));
189+
Expect.equals(0, ltimm0(5));
190+
191+
Expect.equals(1, leimm0(3));
192+
Expect.equals(1, leimm0(4));
193+
Expect.equals(0, leimm0(5));
194+
195+
Expect.equals(0, gtimm0(3));
196+
Expect.equals(0, gtimm0(4));
197+
Expect.equals(1, gtimm0(5));
198+
199+
Expect.equals(0, geimm0(3));
200+
Expect.equals(1, geimm0(4));
201+
Expect.equals(1, geimm0(5));
202+
}
203+
204+
@pragma("vm:never-inline")
205+
dynamic eqimmN(dynamic x) => x == 4 ? 1 : 4;
206+
@pragma("vm:never-inline")
207+
dynamic neimmN(dynamic x) => x != 4 ? 1 : 4;
208+
@pragma("vm:never-inline")
209+
dynamic ltimmN(dynamic x) => x < 4 ? 1 : 4;
210+
@pragma("vm:never-inline")
211+
dynamic leimmN(dynamic x) => x <= 4 ? 1 : 4;
212+
@pragma("vm:never-inline")
213+
dynamic gtimmN(dynamic x) => x > 4 ? 1 : 4;
214+
@pragma("vm:never-inline")
215+
dynamic geimmN(dynamic x) => x >= 4 ? 1 : 4;
216+
217+
testCompareImmN() {
218+
Expect.equals(4, eqimmN(3));
219+
Expect.equals(1, eqimmN(4));
220+
Expect.equals(4, eqimmN(5));
221+
222+
Expect.equals(1, neimmN(3));
223+
Expect.equals(4, neimmN(4));
224+
Expect.equals(1, neimmN(5));
225+
226+
Expect.equals(1, ltimmN(3));
227+
Expect.equals(4, ltimmN(4));
228+
Expect.equals(4, ltimmN(5));
229+
230+
Expect.equals(1, leimmN(3));
231+
Expect.equals(1, leimmN(4));
232+
Expect.equals(4, leimmN(5));
233+
234+
Expect.equals(4, gtimmN(3));
235+
Expect.equals(4, gtimmN(4));
236+
Expect.equals(1, gtimmN(5));
237+
238+
Expect.equals(4, geimmN(3));
239+
Expect.equals(1, geimmN(4));
240+
Expect.equals(1, geimmN(5));
241+
}
242+
243+
@pragma("vm:never-inline")
244+
dynamic zr(dynamic x, dynamic y) => x & y == 0 ? 3 : 7;
245+
@pragma("vm:never-inline")
246+
dynamic nz(dynamic x, dynamic y) => x & y != 0 ? 3 : 7;
247+
248+
testTestReg() {
249+
Expect.equals(7, zr(3, 2));
250+
Expect.equals(7, zr(3, 3));
251+
Expect.equals(3, zr(3, 4));
252+
Expect.equals(3, zr(3, 8));
253+
254+
Expect.equals(3, nz(3, 2));
255+
Expect.equals(3, nz(3, 3));
256+
Expect.equals(7, nz(3, 4));
257+
Expect.equals(7, nz(3, 8));
258+
}
259+
260+
@pragma("vm:never-inline")
261+
dynamic zr0(dynamic x, dynamic y) => x & y == 0 ? 1 : 0;
262+
@pragma("vm:never-inline")
263+
dynamic nz0(dynamic x, dynamic y) => x & y != 0 ? 1 : 0;
264+
265+
testTestReg0() {
266+
Expect.equals(0, zr0(3, 2));
267+
Expect.equals(0, zr0(3, 3));
268+
Expect.equals(1, zr0(3, 4));
269+
Expect.equals(1, zr0(3, 8));
270+
271+
Expect.equals(1, nz0(3, 2));
272+
Expect.equals(1, nz0(3, 3));
273+
Expect.equals(0, nz0(3, 4));
274+
Expect.equals(0, nz0(3, 8));
275+
}
276+
277+
@pragma("vm:never-inline")
278+
dynamic zrN(dynamic x, dynamic y) => x & y == 0 ? 1 : 4;
279+
@pragma("vm:never-inline")
280+
dynamic nzN(dynamic x, dynamic y) => x & y != 0 ? 1 : 4;
281+
282+
testTestRegN() {
283+
Expect.equals(4, zrN(3, 2));
284+
Expect.equals(4, zrN(3, 3));
285+
Expect.equals(1, zrN(3, 4));
286+
Expect.equals(1, zrN(3, 8));
287+
288+
Expect.equals(1, nzN(3, 2));
289+
Expect.equals(1, nzN(3, 3));
290+
Expect.equals(4, nzN(3, 4));
291+
Expect.equals(4, nzN(3, 8));
292+
}
293+
294+
@pragma("vm:never-inline")
295+
dynamic zrimm(dynamic x) => x & 4 == 0 ? 3 : 7;
296+
@pragma("vm:never-inline")
297+
dynamic nzimm(dynamic x) => x & 4 != 0 ? 3 : 7;
298+
299+
testTestImm() {
300+
Expect.equals(3, zrimm(3));
301+
Expect.equals(7, zrimm(4));
302+
Expect.equals(7, zrimm(5));
303+
304+
Expect.equals(7, nzimm(3));
305+
Expect.equals(3, nzimm(4));
306+
Expect.equals(3, nzimm(5));
307+
}
308+
309+
@pragma("vm:never-inline")
310+
dynamic zrimm0(dynamic x) => x & 4 == 0 ? 1 : 0;
311+
@pragma("vm:never-inline")
312+
dynamic nzimm0(dynamic x) => x & 4 != 0 ? 1 : 0;
313+
314+
testTestImm0() {
315+
Expect.equals(1, zrimm0(3));
316+
Expect.equals(0, zrimm0(4));
317+
Expect.equals(0, zrimm0(5));
318+
319+
Expect.equals(0, nzimm0(3));
320+
Expect.equals(1, nzimm0(4));
321+
Expect.equals(1, nzimm0(5));
322+
}
323+
324+
@pragma("vm:never-inline")
325+
dynamic zrimmN(dynamic x) => x & 4 == 0 ? 1 : 4;
326+
@pragma("vm:never-inline")
327+
dynamic nzimmN(dynamic x) => x & 4 != 0 ? 1 : 4;
328+
329+
testTestImmN() {
330+
Expect.equals(1, zrimmN(3));
331+
Expect.equals(4, zrimmN(4));
332+
Expect.equals(4, zrimmN(5));
333+
334+
Expect.equals(4, nzimmN(3));
335+
Expect.equals(1, nzimmN(4));
336+
Expect.equals(1, nzimmN(5));
337+
}
338+
339+
@pragma("vm:never-inline")
340+
dynamic testN(dynamic x) => identical(x, null) ? 1 : 4;
341+
@pragma("vm:never-inline")
342+
dynamic testF(dynamic x) => identical(x, false) ? 1 : 4;
343+
@pragma("vm:never-inline")
344+
dynamic testT(dynamic x) => identical(x, true) ? 1 : 4;
345+
@pragma("vm:never-inline")
346+
dynamic testO(dynamic x) => identical(x, const Object()) ? 1 : 4;
347+
348+
testTempConflicts() {
349+
Expect.equals(1, testN(null));
350+
Expect.equals(4, testN(false));
351+
Expect.equals(4, testN(true));
352+
Expect.equals(4, testN(const Object()));
353+
354+
Expect.equals(4, testF(null));
355+
Expect.equals(1, testF(false));
356+
Expect.equals(4, testF(true));
357+
Expect.equals(4, testF(const Object()));
358+
359+
Expect.equals(4, testT(null));
360+
Expect.equals(4, testT(false));
361+
Expect.equals(1, testT(true));
362+
Expect.equals(4, testT(const Object()));
363+
364+
Expect.equals(4, testO(null));
365+
Expect.equals(4, testO(false));
366+
Expect.equals(4, testO(true));
367+
Expect.equals(1, testO(const Object()));
368+
}
369+
370+
main() {
371+
for (int i = 0; i < 200; i++) {
372+
testCompareReg();
373+
testCompareReg0();
374+
testCompareRegN();
375+
testCompareImm();
376+
testCompareImm0();
377+
testCompareImmN();
378+
testTestReg();
379+
testTestReg0();
380+
testTestRegN();
381+
testTestImm();
382+
testTestImm0();
383+
testTestImmN();
384+
testTempConflicts();
385+
}
386+
}

0 commit comments

Comments
 (0)