| Index: test/mjsunit/regress/regress-crbug-173907.js
|
| diff --git a/test/mjsunit/compiler/property-static.js b/test/mjsunit/regress/regress-crbug-173907.js
|
| similarity index 54%
|
| copy from test/mjsunit/compiler/property-static.js
|
| copy to test/mjsunit/regress/regress-crbug-173907.js
|
| index 07021340cd7aa94440638f925eeed921ee78c9c7..9f92fefa7880d65771fbbe70aedb13d2d039f58e 100644
|
| --- a/test/mjsunit/compiler/property-static.js
|
| +++ b/test/mjsunit/regress/regress-crbug-173907.js
|
| @@ -27,43 +27,62 @@
|
|
|
| // Flags: --allow-natives-syntax
|
|
|
| -// Test usage of static type information for loads that would otherwise
|
| -// turn into polymorphic or generic loads.
|
| +var X = 1.1;
|
| +var K = 0.5;
|
|
|
| -// Prepare a highly polymorphic load to be used by all tests.
|
| -Object.prototype.load = function() { return this.property; };
|
| -Object.prototype.load.call({ A:0, property:10 });
|
| -Object.prototype.load.call({ A:0, B:0, property:11 });
|
| -Object.prototype.load.call({ A:0, B:0, C:0, property:12 });
|
| -Object.prototype.load.call({ A:0, B:0, C:0, D:0, property:13 });
|
| -Object.prototype.load.call({ A:0, B:0, C:0, D:0, E:0, property:14 });
|
| -Object.prototype.load.call({ A:0, B:0, C:0, D:0, E:0, F:0, property:15 });
|
| +var O = 0;
|
| +var result = new Float64Array(2);
|
|
|
| -// Test for object literals.
|
| -(function() {
|
| - function f(x) {
|
| - var object = { property:x };
|
| - return object.load();
|
| - }
|
| +function spill() {
|
| + try { } catch (e) { }
|
| +}
|
|
|
| - assertSame(1, f(1));
|
| - assertSame(2, f(2));
|
| - %OptimizeFunctionOnNextCall(f);
|
| - assertSame(3, f(3));
|
| -})();
|
| +function buggy() {
|
| + var v = X;
|
| + var phi1 = v + K;
|
| + var phi2 = v - K;
|
|
|
| -// Test for inlined constructors.
|
| -(function() {
|
| - function c(x) {
|
| - this.property = x;
|
| - }
|
| - function f(x) {
|
| - var object = new c(x);
|
| - return object.load();
|
| + spill(); // At this point initial values for phi1 and phi2 are spilled.
|
| +
|
| + var xmm1 = v;
|
| + var xmm2 = v*v*v;
|
| + var xmm3 = v*v*v*v;
|
| + var xmm4 = v*v*v*v*v;
|
| + var xmm5 = v*v*v*v*v*v;
|
| + var xmm6 = v*v*v*v*v*v*v;
|
| + var xmm7 = v*v*v*v*v*v*v*v;
|
| + var xmm8 = v*v*v*v*v*v*v*v*v;
|
| +
|
| + // All registers are blocked and phis for phi1 and phi2 are spilled because
|
| + // their left (incoming) value is spilled, there are no free registers,
|
| + // and phis themselves have only ANY-policy uses.
|
| +
|
| + for (var x = 0; x < 2; x++) {
|
| + xmm1 += xmm1 * xmm6;
|
| + xmm2 += xmm1 * xmm5;
|
| + xmm3 += xmm1 * xmm4;
|
| + xmm4 += xmm1 * xmm3;
|
| + xmm5 += xmm1 * xmm2;
|
| +
|
| + // Now swap values of phi1 and phi2 to create cycle between phis.
|
| + var t = phi1;
|
| + phi1 = phi2;
|
| + phi2 = t;
|
| }
|
|
|
| - assertSame(1, f(1));
|
| - assertSame(2, f(2));
|
| - %OptimizeFunctionOnNextCall(f);
|
| - assertSame(3, f(3));
|
| -})();
|
| + // Now we want to get values of phi1 and phi2. However we would like to
|
| + // do it in a way that does not produce any uses of phi1&phi2 that have
|
| + // a register beneficial policy. How? We just hide these uses behind phis.
|
| + result[0] = (O === 0) ? phi1 : phi2;
|
| + result[1] = (O !== 0) ? phi1 : phi2;
|
| +}
|
| +
|
| +function test() {
|
| + buggy();
|
| + assertArrayEquals([X + K, X - K], result);
|
| +}
|
| +
|
| +test();
|
| +test();
|
| +%OptimizeFunctionOnNextCall(buggy);
|
| +test();
|
|
|