Closed Bug 1094052 Opened 10 years ago Closed 10 years ago

Assertion failure: Input shouldn't be negative zero., at jit/IonMacroAssembler.cpp

Categories

(Core :: JavaScript Engine: JIT, defect)

x86_64
macOS
defect
Not set
critical

Tracking

()

RESOLVED FIXED
mozilla36
Tracking Status
firefox36 --- affected

People

(Reporter: gkw, Assigned: sunfish)

References

Details

(Keywords: assertion, regression, testcase, Whiteboard: [fuzzblocker][jsbugmon:update])

Attachments

(1 file)

for (var j = 0; j < 9; j++) { Math.sign(-0) > (function() {}) } asserts js debug shell on m-c changeset 62990ec7ad78 with --ion-eager --no-threads --ion-check-range-analysis at Assertion failure: Input shouldn't be negative zero., at jit/IonMacroAssembler.cpp. Debug configure options: CC="clang -Qunused-arguments" CXX="clang++ -Qunused-arguments" AR=ar AUTOCONF=/usr/local/Cellar/autoconf213/2.13/bin/autoconf213 sh /Users/skywalker/trees/mozilla-central/js/src/configure --target=x86_64-apple-darwin12.5.0 --enable-debug --enable-optimize --enable-nspr-build --enable-more-deterministic --with-ccache --enable-gczeal --enable-debug-symbols --disable-tests autoBisect shows this is probably related to the following changeset: The first bad revision is: changeset: https://hg.mozilla.org/mozilla-central/rev/f718ec4b4cb0 user: Dan Gohman date: Tue Nov 04 10:26:30 2014 -0800 summary: Bug 1073928 - IonMonkey: Represent negative zero explicitly in range analysis r=nbp,h4writer Dan, is bug 1073928 a possible regressor?
Flags: needinfo?(sunfish)
Assertion failure: Input shouldn't be negative zero., at /Users/skywalker/trees/mozilla-central/js/src/jit/IonMacroAssembler.cpp:1524 Process 86646 stopped * thread #1: tid = 0x6692a, 0x00000001050a005f, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) frame #0: 0x00000001050a005f -> 0x1050a005f: movabsq $0x101f5b060, %rax 0x1050a0069: pushq %rcx 0x1050a006a: movabsq $0x101e15c50, %rcx 0x1050a0074: cmpl $0x0, 0x9c(%rcx) (lldb) bt * thread #1: tid = 0x6692a, 0x00000001050a005f, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) * frame #0: 0x00000001050a005f frame #1: 0x0000000105068761 (lldb) Setting this as [fuzzblocker] because this occurs very often.
Yes. Math.sign(-0) is -0, so its range needs to reflect that. The attached patch fixes it. I also added a jsapi-tests test for it, and to take another step toward bug 892702. The main fix is just the change to use the form of Range constructor which allows opRange.canBeNegativeZero() to be passed in. I also added min/max logic for the bounds so that the test for Math.sign(1) looks nicer.
Assignee: nobody → sunfish
Flags: needinfo?(sunfish)
Attachment #8517459 - Flags: review?(nicolas.b.pierron)
Attachment #8517459 - Flags: review?(hv1989)
Comment on attachment 8517459 [details] [diff] [review] range-math-sign-negative-zero.patch Review of attachment 8517459 [details] [diff] [review]: ----------------------------------------------------------------- ::: js/src/jit/RangeAnalysis.cpp @@ +1120,5 @@ > +{ > + return op->canBeNaN() > + ? nullptr > + : new(alloc) Range(Max(Min(op->lower_, 1), -1), > + Max(Min(op->upper_, 1), -1), nice! @@ +1122,5 @@ > + ? nullptr > + : new(alloc) Range(Max(Min(op->lower_, 1), -1), > + Max(Min(op->upper_, 1), -1), > + Range::ExcludesFractionalParts, > + op->canBeNegativeZero(), nit: Use the enum constructor to wrap this boolean. We should avoid implicit constructors (even if this is an enum). ::: js/src/jsapi-tests/testJitRangeAnalysis.cpp @@ +15,5 @@ > + > +using namespace js; > +using namespace js::jit; > + > +BEGIN_TEST(testJitRangeAnalysis_MathSign) Awesome!
Attachment #8517459 - Flags: review?(nicolas.b.pierron) → review+
Comment on attachment 8517459 [details] [diff] [review] range-math-sign-negative-zero.patch Review of attachment 8517459 [details] [diff] [review]: ----------------------------------------------------------------- ::: js/src/jit/RangeAnalysis.cpp @@ +1117,5 @@ > > +Range * > +Range::sign(TempAllocator &alloc, const Range *op) > +{ > + return op->canBeNaN() can you do: if (op->canBeNan()) return nullptr; return new ...
Attachment #8517459 - Flags: review?(hv1989) → review+
Status: NEW → RESOLVED
Closed: 10 years ago
Resolution: --- → FIXED
Target Milestone: --- → mozilla36
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Created:
Updated:
Size: