Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(110)

Side by Side Diff: tests/compiler/dart2js_extra/round_constant_folding_test.dart

Issue 2400853003: dart2js: Constant fold num.round() (Closed)
Patch Set: Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2016, 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 import 'package:expect/expect.dart';
6
7 const double PD1 = 0.0;
8 const double PD2 = double.MIN_POSITIVE;
9 const double PD3 = 2.0 * double.MIN_POSITIVE;
10 const double PD4 = 1.18e-38;
11 const double PD5 = 1.18e-38 * 2;
12 const double PD6 = 0.49999999999999994;
13 const double PD7 = 0.5;
14 const double PD8 = 0.9999999999999999;
15 const double PD9 = 1.0;
16 const double PD10 = 1.000000000000001;
17 const double PD11 = double.MAX_FINITE;
18
19 const double ND1 = -PD1;
20 const double ND2 = -PD2;
21 const double ND3 = -PD3;
22 const double ND4 = -PD4;
23 const double ND5 = -PD5;
24 const double ND6 = -PD6;
25 const double ND7 = -PD7;
26 const double ND8 = -PD8;
27 const double ND9 = -PD9;
28 const double ND10 = -PD10;
29 const double ND11 = -PD11;
30
31 const X1 = double.INFINITY;
32 const X2 = double.NEGATIVE_INFINITY;
33 const X3 = double.NAN;
34
35 // The following numbers are on the border of 52 bits.
36 // For example: 4503599627370499 + 0.5 => 4503599627370500.
37 const PQ1 = 4503599627370496.0;
38 const PQ2 = 4503599627370497.0;
39 const PQ3 = 4503599627370498.0;
40 const PQ4 = 4503599627370499.0;
41 const PQ5 = 9007199254740991.0;
42 const PQ6 = 9007199254740992.0;
43
44 const NQ1 = -PQ1;
45 const NQ2 = -PQ2;
46 const NQ3 = -PQ3;
47 const NQ4 = -PQ4;
48 const NQ5 = -PQ5;
49 const NQ6 = -PQ6;
50
51 const int PI1 = 0;
52 const int PI2 = 1;
53 const int PI3 = 0x1234;
54 const int PI4 = 0x12345678;
55 const int PI5 = 0x123456789AB;
56 const int PI6 = 0x123456789ABCDEF;
57 const int PI7 = 0x123456789ABCDEF0123456789ABCDEF0123456789ABCDEF;
58
59 const int NI1 = 0-PI1;
60 const int NI2 = -PI2;
61 const int NI3 = -PI3;
62 const int NI4 = -PI4;
63 const int NI5 = -PI5;
64 const int NI6 = -PI6;
65 const int NI7 = -PI7;
66
67
68 /// Ensures that the behaviour of `action()` is the same as `value.round()`.
69 @NoInline() // To ensure 'value.round()' has a non-constant receiver.
70 check(value, action) {
71 var result1, result2;
72 try {
73 result1 = value.round();
74 } catch (e) {
75 result1 = e;
76 }
77
78 try {
79 result2 = action();
80 } catch (e) {
81 result2 = e;
82 }
83
84 Expect.equals(result1.runtimeType, result2.runtimeType);
85 if (result1 is num) {
86 Expect.equals(result1, result2);
87 Expect.equals(result1 is int, result2 is int);
88 } else {
89 Expect.equals(result1.runtimeType, result2.runtimeType);
90 Expect.isTrue(result1 is Error);
91 }
92 }
93
94 @NoInline()
95 void unusedCall(num x) {
96 x.round(); // This call should not be removed since it might throw.
97 }
98
99 main() {
100 check(PD1, () => PD1.round());
101 check(PD2, () => PD2.round());
102 check(PD3, () => PD3.round());
103 check(PD4, () => PD4.round());
104 check(PD5, () => PD5.round());
105 check(PD6, () => PD6.round());
106 check(PD7, () => PD7.round());
107 check(PD8, () => PD8.round());
108 check(PD9, () => PD9.round());
109 check(PD10, () => PD10.round());
110 check(PD11, () => PD11.round());
111
112 check(ND1, () => ND1.round());
113 check(ND2, () => ND2.round());
114 check(ND3, () => ND3.round());
115 check(ND4, () => ND4.round());
116 check(ND5, () => ND5.round());
117 check(ND6, () => ND6.round());
118 check(ND7, () => ND7.round());
119 check(ND8, () => ND8.round());
120 check(ND9, () => ND9.round());
121 check(ND10, () => ND10.round());
122 check(ND11, () => ND11.round());
123
124 check(X1, () => X1.round());
125 check(X2, () => X2.round());
126 check(X3, () => X3.round());
127
128 check(PQ1, () => PQ1.round());
129 check(PQ2, () => PQ2.round());
130 check(PQ3, () => PQ3.round());
131 check(PQ4, () => PQ4.round());
132 check(PQ5, () => PQ5.round());
133 check(PQ6, () => PQ6.round());
134
135 check(NQ1, () => NQ1.round());
136 check(NQ2, () => NQ2.round());
137 check(NQ3, () => NQ3.round());
138 check(NQ4, () => NQ4.round());
139 check(NQ5, () => NQ5.round());
140 check(NQ6, () => NQ6.round());
141
142 check(PI1, () => PI1.round());
143 check(PI2, () => PI2.round());
144 check(PI3, () => PI3.round());
145 check(PI4, () => PI4.round());
146 check(PI5, () => PI5.round());
147 check(PI6, () => PI6.round());
148 check(PI7, () => PI7.round());
149
150 check(NI1, () => NI1.round());
151 check(NI2, () => NI2.round());
152 check(NI3, () => NI3.round());
153 check(NI4, () => NI4.round());
154 check(NI5, () => NI5.round());
155 check(NI6, () => NI6.round());
156 check(NI7, () => NI7.round());
157
158 // Check that the operation is not removed if it can throw, even if the result
159 // is unused.
160 Expect.throws(() { X1.round(); });
161 Expect.throws(() { X2.round(); });
162 Expect.throws(() { X3.round(); });
163 unusedCall(0);
164 Expect.throws(() { unusedCall(X1); });
165 Expect.throws(() { unusedCall(X2); });
166 Expect.throws(() { unusedCall(X3); });
167 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698