| function opaqueModuloSmaller(a) |
| { |
| return (a % 5) % 13; |
| } |
| noInline(opaqueModuloSmaller); |
| |
| function opaqueModuloEqual(a) |
| { |
| return (a % 5) % 5; |
| } |
| noInline(opaqueModuloEqual); |
| |
| function opaqueModuloLarger(a) |
| { |
| return (a % 13) % 5; |
| } |
| noInline(opaqueModuloLarger); |
| |
| function opaqueModuloSmallerNeg(a) |
| { |
| return (a % -5) % -13; |
| } |
| noInline(opaqueModuloSmallerNeg); |
| |
| function opaqueModuloEqualNeg(a) |
| { |
| return (a % 5) % -5; |
| } |
| noInline(opaqueModuloEqualNeg); |
| |
| function opaqueModuloLargerNeg(a) |
| { |
| return (a % -13) % 5; |
| } |
| noInline(opaqueModuloLargerNeg); |
| |
| let testReducibleCases = [opaqueModuloSmaller, opaqueModuloEqual, opaqueModuloSmallerNeg, opaqueModuloEqualNeg]; |
| let testOtherCases = [opaqueModuloLarger, opaqueModuloLargerNeg]; |
| |
| function opaqueExpectedOther(doubleInput) |
| { |
| return (doubleInput - 2147483648) % 13.0 % 5.0; |
| } |
| noInline(opaqueExpectedOther); |
| noDFG(opaqueExpectedOther); |
| |
| // Warm up with integers. The test for NegZero should not be eliminated here. |
| for (let i = 1; i < 1e4; ++i) { |
| let excpectedReduced = i % 5; |
| for (let testFunction of testReducibleCases) { |
| let result = testFunction(i); |
| if (result !== excpectedReduced) |
| throw "" + testFunction.name + "(i), returned: " + result + " at i = " + i + " expected " + expectedOther; |
| } |
| let expectedOther = opaqueExpectedOther(i + 2147483648); |
| for (let testFunction of testOtherCases) { |
| let result = testFunction(i); |
| if (result !== expectedOther) |
| throw "" + testFunction.name + "(i), returned: " + result + " at i = " + i + " expected " + expectedOther; |
| } |
| } |