Bug 1255949 - Check fallible flag in MBoundsCheck::congruentTo. r=h4writer
authorJan de Mooij <jdemooij@mozilla.com>
Thu, 24 Mar 2016 15:09:49 +0100
changeset 290235 6a57a5f81339e57cc6443b7142b15810c5fd5fe1
parent 290234 2912de2754baafcc07201c4ecda7c975622e6df5
child 290236 01e5078734f559dd1bc8503196c8fa5af33c7385
push id30117
push userryanvm@gmail.com
push dateFri, 25 Mar 2016 15:36:00 +0000
treeherdermozilla-central@b45ee3e065b7 [default view] [failures only]
perfherder[talos] [build metrics] [platform microbench] (compared to previous push)
reviewersh4writer
bugs1255949
milestone48.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
Bug 1255949 - Check fallible flag in MBoundsCheck::congruentTo. r=h4writer
js/src/jit/IonAnalysis.cpp
js/src/jit/MIR.h
--- 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_;