| Index: src/compiler/frame.h
 | 
| diff --git a/src/compiler/frame.h b/src/compiler/frame.h
 | 
| index 77dccaa629cc0c36e2cb604dc5e3ebf3e7065055..d413d3e0336841dee93a753b12a3b431dad99994 100644
 | 
| --- a/src/compiler/frame.h
 | 
| +++ b/src/compiler/frame.h
 | 
| @@ -81,26 +81,13 @@ class Frame : public ZoneObject {
 | 
|    explicit Frame(int fixed_frame_size_in_slots,
 | 
|                   const CallDescriptor* descriptor);
 | 
|  
 | 
| -  inline bool needs_frame() const { return needs_frame_; }
 | 
| -  inline void MarkNeedsFrame() { needs_frame_ = true; }
 | 
| -
 | 
|    inline int GetTotalFrameSlotCount() const { return frame_slot_count_; }
 | 
|  
 | 
| -  inline int GetSPToFPSlotCount() const {
 | 
| -    return GetTotalFrameSlotCount() -
 | 
| -           StandardFrameConstants::kFixedSlotCountAboveFp;
 | 
| -  }
 | 
|    inline int GetSavedCalleeRegisterSlotCount() const {
 | 
|      return callee_saved_slot_count_;
 | 
|    }
 | 
|    inline int GetSpillSlotCount() const { return spill_slot_count_; }
 | 
|  
 | 
| -  inline void SetElidedFrameSizeInSlots(int slots) {
 | 
| -    DCHECK_EQ(0, callee_saved_slot_count_);
 | 
| -    DCHECK_EQ(0, spill_slot_count_);
 | 
| -    frame_slot_count_ = slots;
 | 
| -  }
 | 
| -
 | 
|    void SetAllocatedRegisters(BitVector* regs) {
 | 
|      DCHECK(allocated_registers_ == nullptr);
 | 
|      allocated_registers_ = regs;
 | 
| @@ -120,21 +107,18 @@ class Frame : public ZoneObject {
 | 
|      int alignment_slots = alignment / kPointerSize;
 | 
|      int delta = alignment_slots - (frame_slot_count_ & (alignment_slots - 1));
 | 
|      if (delta != alignment_slots) {
 | 
| -      DCHECK(needs_frame_);
 | 
|        frame_slot_count_ += delta;
 | 
|      }
 | 
|      return delta;
 | 
|    }
 | 
|  
 | 
|    void AllocateSavedCalleeRegisterSlots(int count) {
 | 
| -    needs_frame_ = true;
 | 
|      frame_slot_count_ += count;
 | 
|      callee_saved_slot_count_ += count;
 | 
|    }
 | 
|  
 | 
|    int AllocateSpillSlot(int width) {
 | 
|      DCHECK_EQ(0, callee_saved_slot_count_);
 | 
| -    needs_frame_ = true;
 | 
|      int frame_slot_count_before = frame_slot_count_;
 | 
|      int slot = AllocateAlignedFrameSlot(width);
 | 
|      spill_slot_count_ += (frame_slot_count_ - frame_slot_count_before);
 | 
| @@ -146,7 +130,6 @@ class Frame : public ZoneObject {
 | 
|    int ReserveSpillSlots(size_t slot_count) {
 | 
|      DCHECK_EQ(0, callee_saved_slot_count_);
 | 
|      DCHECK_EQ(0, spill_slot_count_);
 | 
| -    needs_frame_ = true;
 | 
|      spill_slot_count_ += static_cast<int>(slot_count);
 | 
|      frame_slot_count_ += static_cast<int>(slot_count);
 | 
|      return frame_slot_count_ - 1;
 | 
| @@ -168,7 +151,6 @@ class Frame : public ZoneObject {
 | 
|    }
 | 
|  
 | 
|   private:
 | 
| -  bool needs_frame_;
 | 
|    int frame_slot_count_;
 | 
|    int callee_saved_slot_count_;
 | 
|    int spill_slot_count_;
 | 
| @@ -210,23 +192,33 @@ class FrameOffset {
 | 
|  class FrameAccessState : public ZoneObject {
 | 
|   public:
 | 
|    explicit FrameAccessState(Frame* const frame)
 | 
| -      : frame_(frame), access_frame_with_fp_(false), sp_delta_(0) {
 | 
| -    SetFrameAccessToDefault();
 | 
| -  }
 | 
| +      : frame_(frame),
 | 
| +        access_frame_with_fp_(false),
 | 
| +        sp_delta_(0),
 | 
| +        has_frame_(false) {}
 | 
|  
 | 
|    Frame* frame() const { return frame_; }
 | 
| +  void MarkHasFrame(bool state);
 | 
|  
 | 
|    int sp_delta() const { return sp_delta_; }
 | 
|    void ClearSPDelta() { sp_delta_ = 0; }
 | 
|    void IncreaseSPDelta(int amount) { sp_delta_ += amount; }
 | 
|  
 | 
|    bool access_frame_with_fp() const { return access_frame_with_fp_; }
 | 
| +
 | 
| +  // Regardless of how we access slots on the stack - using sp or fp - do we
 | 
| +  // have a frame, at the current stage in code generation.
 | 
| +  bool has_frame() const { return has_frame_; }
 | 
| +
 | 
|    void SetFrameAccessToDefault();
 | 
|    void SetFrameAccessToFP() { access_frame_with_fp_ = true; }
 | 
|    void SetFrameAccessToSP() { access_frame_with_fp_ = false; }
 | 
|  
 | 
|    int GetSPToFPSlotCount() const {
 | 
| -    return frame_->GetSPToFPSlotCount() + sp_delta();
 | 
| +    int frame_slot_count =
 | 
| +        (has_frame() ? frame()->GetTotalFrameSlotCount() : kElidedFrameSlots) -
 | 
| +        StandardFrameConstants::kFixedSlotCountAboveFp;
 | 
| +    return frame_slot_count + sp_delta();
 | 
|    }
 | 
|    int GetSPToFPOffset() const { return GetSPToFPSlotCount() * kPointerSize; }
 | 
|  
 | 
| @@ -240,6 +232,7 @@ class FrameAccessState : public ZoneObject {
 | 
|    Frame* const frame_;
 | 
|    bool access_frame_with_fp_;
 | 
|    int sp_delta_;
 | 
| +  bool has_frame_;
 | 
|  };
 | 
|  }  // namespace compiler
 | 
|  }  // namespace internal
 | 
| 
 |