author | Jan de Mooij <jdemooij@mozilla.com> |
Thu, 24 Mar 2016 15:09:49 +0100 | |
changeset 290235 | 6a57a5f81339e57cc6443b7142b15810c5fd5fe1 |
parent 290234 | 2912de2754baafcc07201c4ecda7c975622e6df5 |
child 290236 | 01e5078734f559dd1bc8503196c8fa5af33c7385 |
push id | 30117 |
push user | ryanvm@gmail.com |
push date | Fri, 25 Mar 2016 15:36:00 +0000 |
treeherder | mozilla-central@b45ee3e065b7 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | h4writer |
bugs | 1255949 |
milestone | 48.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
js/src/jit/IonAnalysis.cpp | file | annotate | diff | comparison | revisions | |
js/src/jit/MIR.h | file | annotate | diff | comparison | revisions |
--- a/js/src/jit/IonAnalysis.cpp +++ b/js/src/jit/IonAnalysis.cpp @@ -2812,16 +2812,19 @@ TryEliminateBoundsCheck(BoundsCheckMap& // bounds checks and would otherwise use the wrong index and // (b) helps register allocation. Note that this is safe since // no other pass after bounds check elimination moves instructions. dominated->replaceAllUsesWith(dominated->index()); if (!dominated->isMovable()) return true; + if (!dominated->fallible()) + return true; + MBoundsCheck* dominating = FindDominatingBoundsCheck(checks, dominated, blockIndex); if (!dominating) return false; if (dominating == dominated) { // We didn't find a dominating bounds check. return true; }
--- a/js/src/jit/MIR.h +++ b/js/src/jit/MIR.h @@ -9060,31 +9060,35 @@ class MBoundsCheck } MDefinition* length() const { return getOperand(1); } int32_t minimum() const { return minimum_; } void setMinimum(int32_t n) { + MOZ_ASSERT(fallible_); minimum_ = n; } int32_t maximum() const { return maximum_; } void setMaximum(int32_t n) { + MOZ_ASSERT(fallible_); maximum_ = n; } MDefinition* foldsTo(TempAllocator& alloc) override; bool congruentTo(const MDefinition* ins) const override { if (!ins->isBoundsCheck()) return false; const MBoundsCheck* other = ins->toBoundsCheck(); if (minimum() != other->minimum() || maximum() != other->maximum()) return false; + if (fallible() != other->fallible()) + return false; return congruentIfOperandsEqual(other); } virtual AliasSet getAliasSet() const override { return AliasSet::None(); } void computeRange(TempAllocator& alloc) override; bool fallible() const { return fallible_;