// 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);