| // Copyright 2016 the V8 project authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // Flags: --allow-natives-syntax |
| |
| // For TurboFan, make sure we can eliminate the -0 return value check |
| // by recognizing a constant value. |
| function gotaconstant(y) { return 15 * y; } |
| %PrepareFunctionForOptimization(gotaconstant); |
| assertEquals(45, gotaconstant(3)); |
| gotaconstant(3); |
| %OptimizeFunctionOnNextCall(gotaconstant); |
| gotaconstant(3); |
| |
| function gotaconstant_truncated(x, y) { return x * y | 0; } |
| %PrepareFunctionForOptimization(gotaconstant_truncated); |
| assertEquals(45, gotaconstant_truncated(3, 15)); |
| gotaconstant_truncated(3, 15); |
| %OptimizeFunctionOnNextCall(gotaconstant_truncated); |
| gotaconstant_truncated(3, 15); |
| |
| function test(x, y) { return x * y; } |
| |
| %PrepareFunctionForOptimization(test); |
| assertEquals(12, test(3, 4)); |
| assertEquals(16, test(4, 4)); |
| |
| %OptimizeFunctionOnNextCall(test); |
| assertEquals(27, test(9, 3)); |
| |
| assertEquals(-0, test(-3, 0)); |
| assertEquals(-0, test(0, -0)); |
| |
| |
| const SMI_MAX = (1 << 29) - 1 + (1 << 29); // Create without overflowing. |
| const SMI_MIN = -SMI_MAX - 1; // Create without overflowing. |
| |
| // multiply by 3 to avoid compiler optimizations that convert 2*x to x + x. |
| assertEquals(SMI_MAX + SMI_MAX + SMI_MAX, test(SMI_MAX, 3)); |
| |
| // Verify that strength reduction will reduce the -0 check quite a bit |
| // if we have a negative integer constant. |
| function negtest(y) { return -3 * y; } |
| %PrepareFunctionForOptimization(negtest); |
| assertEquals(-12, negtest(4)); |
| assertEquals(-12, negtest(4)); |
| %OptimizeFunctionOnNextCall(negtest); |
| negtest(4); |