13ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch// Copyright 2012 the V8 project authors. All rights reserved.
2b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Redistribution and use in source and binary forms, with or without
3b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// modification, are permitted provided that the following conditions are
4b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// met:
5b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
6b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions of source code must retain the above copyright
7b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       notice, this list of conditions and the following disclaimer.
8b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Redistributions in binary form must reproduce the above
9b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       copyright notice, this list of conditions and the following
10b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       disclaimer in the documentation and/or other materials provided
11b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       with the distribution.
12b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//     * Neither the name of Google Inc. nor the names of its
13b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       contributors may be used to endorse or promote products derived
14b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//       from this software without specific prior written permission.
15b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch//
16b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
28b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "v8.h"
29b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
30b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "factory.h"
31b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "hydrogen.h"
32b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
33b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#if V8_TARGET_ARCH_IA32
34b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "ia32/lithium-ia32.h"
35b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#elif V8_TARGET_ARCH_X64
36b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "x64/lithium-x64.h"
37b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#elif V8_TARGET_ARCH_ARM
38b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#include "arm/lithium-arm.h"
3944f0eee88ff00398ff7f715fab053374d808c90dSteve Block#elif V8_TARGET_ARCH_MIPS
4044f0eee88ff00398ff7f715fab053374d808c90dSteve Block#include "mips/lithium-mips.h"
41b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#else
42b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#error Unsupported target architecture.
43b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
44b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
45b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace v8 {
46b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochnamespace internal {
47b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
48b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#define DEFINE_COMPILE(type)                                         \
49b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  LInstruction* H##type::CompileToLithium(LChunkBuilder* builder) {  \
50b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return builder->Do##type(this);                                  \
51b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
52b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHYDROGEN_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
53b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#undef DEFINE_COMPILE
54b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
55b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
56b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* Representation::Mnemonic() const {
57b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (kind_) {
58b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kNone: return "v";
59b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTagged: return "t";
60b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kDouble: return "d";
61b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kInteger32: return "i";
62e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case kExternal: return "x";
63257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default:
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      UNREACHABLE();
65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return NULL;
66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
67257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
68257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
69257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochint HValue::LoopWeight() const {
713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const int w = FLAG_loop_weight;
723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  static const int weights[] = { 1, w, w*w, w*w*w, w*w*w*w };
733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return weights[Min(block()->LoopNestingDepth(),
743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                     static_cast<int>(ARRAY_SIZE(weights)-1))];
753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
78257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::AssumeRepresentation(Representation r) {
79257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (CheckFlag(kFlexibleRepresentation)) {
80257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ChangeRepresentation(r);
81257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // The representation of the value is dictated by type feedback and
82257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    // will not be changed later.
83257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ClearFlag(kFlexibleRepresentation);
84257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t ConvertAndSetOverflow(int64_t result, bool* overflow) {
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (result > kMaxInt) {
90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    *overflow = true;
91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kMaxInt;
92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (result < kMinInt) {
94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    *overflow = true;
95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kMinInt;
96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return static_cast<int32_t>(result);
98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t AddWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int64_t result = static_cast<int64_t>(a) + static_cast<int64_t>(b);
103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return ConvertAndSetOverflow(result, overflow);
104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t SubWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int64_t result = static_cast<int64_t>(a) - static_cast<int64_t>(b);
109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return ConvertAndSetOverflow(result, overflow);
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t MulWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int64_t result = static_cast<int64_t>(a) * static_cast<int64_t>(b);
115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return ConvertAndSetOverflow(result, overflow);
116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint32_t Range::Mask() const {
120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (lower_ == upper_) return lower_;
121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (lower_ >= 0) {
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int32_t res = 1;
123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    while (res < upper_) {
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      res = (res << 1) | 1;
125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return 0xffffffff;
129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::AddConstant(int32_t value) {
133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (value == 0) return;
134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;  // Overflow is ignored here.
135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = AddWithoutOverflow(lower_, value, &may_overflow);
136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = AddWithoutOverflow(upper_, value, &may_overflow);
1373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
1393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
143e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Intersect(Range* other) {
144e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = Min(upper_, other->upper_);
145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = Max(lower_, other->lower_);
146e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool b = CanBeMinusZero() && other->CanBeMinusZero();
147e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(b);
148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
149e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Union(Range* other) {
152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = Max(upper_, other->upper_);
153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = Min(lower_, other->lower_);
154e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool b = CanBeMinusZero() || other->CanBeMinusZero();
155e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(b);
156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
159e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Sar(int32_t value) {
160e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t bits = value & 0x1F;
161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = lower_ >> bits;
162e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = upper_ >> bits;
163e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(false);
164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
165e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
166e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
167e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Shl(int32_t value) {
168e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t bits = value & 0x1F;
169e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int old_lower = lower_;
170e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int old_upper = upper_;
171e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = lower_ << bits;
172e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = upper_ << bits;
173e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) {
174e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    upper_ = kMaxInt;
175e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    lower_ = kMinInt;
176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
177e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(false);
178e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
179e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
180e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::AddAndCheckOverflow(Range* other) {
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = AddWithoutOverflow(lower_, other->lower(), &may_overflow);
184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = AddWithoutOverflow(upper_, other->upper(), &may_overflow);
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  KeepOrder();
1863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
1883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return may_overflow;
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::SubAndCheckOverflow(Range* other) {
194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;
195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = SubWithoutOverflow(lower_, other->upper(), &may_overflow);
196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = SubWithoutOverflow(upper_, other->lower(), &may_overflow);
197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  KeepOrder();
1983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
2003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return may_overflow;
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::KeepOrder() {
206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (lower_ > upper_) {
207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int32_t tmp = lower_;
208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    lower_ = upper_;
209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    upper_ = tmp;
210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::Verify() const {
216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(lower_ <= upper_);
217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::MulAndCheckOverflow(Range* other) {
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v1 = MulWithoutOverflow(lower_, other->lower(), &may_overflow);
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v2 = MulWithoutOverflow(lower_, other->upper(), &may_overflow);
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v3 = MulWithoutOverflow(upper_, other->lower(), &may_overflow);
226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v4 = MulWithoutOverflow(upper_, other->upper(), &may_overflow);
227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = Min(Min(v1, v2), Min(v3, v4));
228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = Max(Max(v1, v2), Max(v3, v4));
2293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#ifdef DEBUG
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
2313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#endif
232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return may_overflow;
233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HType::ToString() {
237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (type_) {
238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTagged: return "tagged";
239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTaggedPrimitive: return "primitive";
240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTaggedNumber: return "number";
241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kSmi: return "smi";
242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kHeapNumber: return "heap-number";
243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kString: return "string";
244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kBoolean: return "boolean";
245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kNonPrimitive: return "non-primitive";
246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kJSArray: return "array";
247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kJSObject: return "object";
248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kUninitialized: return "uninitialized";
249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UNREACHABLE();
251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return "Unreachable code";
252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHType HType::TypeFromValue(Handle<Object> value) {
256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType result = HType::Tagged();
257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (value->IsSmi()) {
258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::Smi();
259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsHeapNumber()) {
260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::HeapNumber();
261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsString()) {
262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::String();
263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsBoolean()) {
264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::Boolean();
265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsJSObject()) {
266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::JSObject();
267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsJSArray()) {
268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::JSArray();
269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
274257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochbool HValue::IsDefinedAfter(HBasicBlock* other) const {
275257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return block()->block_id() > other->block_id();
276257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
277257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
278257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHUseListNode* HUseListNode::tail() {
2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Skip and remove dead items in the use list.
2813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  while (tail_ != NULL && tail_->value()->CheckFlag(HValue::kIsDead)) {
2823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    tail_ = tail_->tail_;
2833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return tail_;
2853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool HValue::CheckUsesForFlag(Flag f) {
2893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
2903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!it.value()->CheckFlag(f)) return false;
2913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
2923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return true;
2933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
2943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
296257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHUseIterator::HUseIterator(HUseListNode* head) : next_(head) {
297257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  Advance();
298257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
300257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
301257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HUseIterator::Advance() {
302257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  current_ = next_;
303257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (current_ != NULL) {
304257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    next_ = current_->tail();
305257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    value_ = current_->value();
306257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    index_ = current_->index();
307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
311257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochint HValue::UseCount() const {
312257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  int count = 0;
313257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (HUseIterator it(uses()); !it.Done(); it.Advance()) ++count;
314257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return count;
315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHUseListNode* HValue::RemoveUse(HValue* value, int index) {
319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* previous = NULL;
320257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* current = use_list_;
321257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  while (current != NULL) {
322257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (current->value() == value && current->index() == index) {
323257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      if (previous == NULL) {
324257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        use_list_ = current->tail();
325257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      } else {
326257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        previous->set_tail(current->tail());
327257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      }
328257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
330257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    previous = current;
332257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    current = current->tail();
333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
334257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
335257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#ifdef DEBUG
336257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // Do not reuse use list nodes in debug mode, zap them.
337257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (current != NULL) {
338257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HUseListNode* temp =
339257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        new HUseListNode(current->value(), current->index(), NULL);
340257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    current->Zap();
341257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    current = temp;
342257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
343257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#endif
344257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return current;
345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
348e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool HValue::Equals(HValue* other) {
349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (other->opcode() != opcode()) return false;
350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!other->representation().Equals(representation())) return false;
351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!other->type_.Equals(type_)) return false;
3521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (other->flags() != flags()) return false;
353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (OperandCount() != other->OperandCount()) return false;
354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (OperandAt(i)->id() != other->OperandAt(i)->id()) return false;
356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool result = DataEquals(other);
358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!result || Hashcode() == other->Hashcode());
359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochintptr_t HValue::Hashcode() {
364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  intptr_t result = opcode();
365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int count = OperandCount();
366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < count; ++i) {
367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = result * 19 + OperandAt(i)->id() + (result >> 7);
368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
373257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochconst char* HValue::Mnemonic() const {
374257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  switch (opcode()) {
375257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#define MAKE_CASE(type) case k##type: return #type;
376257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HYDROGEN_CONCRETE_INSTRUCTION_LIST(MAKE_CASE)
377257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#undef MAKE_CASE
378257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case kPhi: return "Phi";
379257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default: return "";
380257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
381257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
382257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
383257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::SetOperandAt(int index, HValue* value) {
385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  RegisterUse(index, value);
386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InternalSetOperandAt(index, value);
387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
390257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::DeleteAndReplaceWith(HValue* other) {
391257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  // We replace all uses first, so Delete can assert that there are none.
392257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (other != NULL) ReplaceAllUsesWith(other);
393257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(HasNoUses());
3943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Kill();
395257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  DeleteFromGraph();
396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
399257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::ReplaceAllUsesWith(HValue* other) {
400257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  while (use_list_ != NULL) {
401257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HUseListNode* list_node = use_list_;
402257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HValue* value = list_node->value();
403257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    ASSERT(!value->block()->IsStartBlock());
404257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    value->InternalSetOperandAt(list_node->index(), other);
405257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    use_list_ = list_node->tail();
406257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    list_node->set_tail(other->use_list_);
407257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    other->use_list_ = list_node;
408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
4123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HValue::Kill() {
4133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Instead of going through the entire use list of each operand, we only
4143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // check the first item in each use list and rely on the tail() method to
4153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // skip dead items, removing them lazily next time we traverse the list.
4163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SetFlag(kIsDead);
417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
4183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HValue* operand = OperandAt(i);
4193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HUseListNode* first = operand->use_list_;
4203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (first != NULL && first->value() == this && first->index() == i) {
4213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      operand->use_list_ = first->tail();
4223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
427257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::SetBlock(HBasicBlock* block) {
428257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(block_ == NULL || block == NULL);
429257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  block_ = block;
430257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (id_ == kNoNumber && block != NULL) {
431257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    id_ = block->graph()->GetNextValueID(this);
432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
436257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::PrintTypeTo(StringStream* stream) {
437257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (!representation().IsTagged() || type().Equals(HType::Tagged())) return;
438257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" type[%s]", type().ToString());
439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
442257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::PrintRangeTo(StringStream* stream) {
443257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (range() == NULL || range()->IsMostGeneric()) return;
444257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" range[%d,%d,m0=%d]",
445257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch              range()->lower(),
446257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch              range()->upper(),
447257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch              static_cast<int>(range()->CanBeMinusZero()));
448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
451257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HValue::PrintChangesTo(StringStream* stream) {
4523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  GVNFlagSet changes_flags = ChangesFlags();
4533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (changes_flags.IsEmpty()) return;
454257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" changes[");
4553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (changes_flags == AllSideEffectsFlagSet()) {
456257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    stream->Add("*");
457257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  } else {
458257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    bool add_comma = false;
4593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define PRINT_DO(type)                            \
4603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (changes_flags.Contains(kChanges##type)) { \
4613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (add_comma) stream->Add(",");            \
4623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      add_comma = true;                           \
4633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      stream->Add(#type);                         \
464257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
465257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    GVN_FLAG_LIST(PRINT_DO);
466257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch#undef PRINT_DO
467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
468257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add("]");
469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::PrintNameTo(StringStream* stream) {
473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s%d", representation_.Mnemonic(), id());
474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HValue::UpdateInferredType() {
478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type = CalculateInferredType();
479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool result = (!type.Equals(type_));
480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  type_ = type;
481b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RegisterUse(int index, HValue* new_value) {
486b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue* old_value = OperandAt(index);
487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (old_value == new_value) return;
488257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
489257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  HUseListNode* removed = NULL;
490257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  if (old_value != NULL) {
491257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    removed = old_value->RemoveUse(this, index);
492257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
493257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (new_value != NULL) {
495257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (removed == NULL) {
496257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      new_value->use_list_ =
497257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          new HUseListNode(this, index, new_value->use_list_);
498257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    } else {
499257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      removed->set_tail(new_value->use_list_);
500257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      new_value->use_list_ = removed;
501257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    }
502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HValue::AddNewRange(Range* r, Zone* zone) {
5073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!HasRange()) ComputeInitialRange(zone);
5083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!HasRange()) range_ = new(zone) Range();
509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasRange());
510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  r->StackUpon(range_);
511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  range_ = r;
512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RemoveLastAddedRange() {
516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasRange());
517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(range_->next() != NULL);
518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  range_ = range_->next();
519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
5223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HValue::ComputeInitialRange(Zone* zone) {
523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!HasRange());
5243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  range_ = InferRange(zone);
525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasRange());
526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
529e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstruction::PrintTo(StringStream* stream) {
530257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PrintMnemonicTo(stream);
531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PrintDataTo(stream);
532257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PrintRangeTo(stream);
533257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PrintChangesTo(stream);
534257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  PrintTypeTo(stream);
535257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
538257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HInstruction::PrintMnemonicTo(StringStream* stream) {
539589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  stream->Add("%s ", Mnemonic());
540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::Unlink() {
544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(IsLinked());
545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsControlInstruction());  // Must never move control instructions.
546e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(!IsBlockEntry());  // Doesn't make sense to delete these.
547e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(previous_ != NULL);
548e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  previous_->next_ = next_;
549e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (next_ == NULL) {
550e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(block()->last() == this);
551e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    block()->set_last(previous_);
552e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
553e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    next_->previous_ = previous_;
554e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  clear_block();
556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertBefore(HInstruction* next) {
560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsLinked());
561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!next->IsBlockEntry());
562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsControlInstruction());
563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!next->block()->IsStartBlock());
564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(next->previous_ != NULL);
565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* prev = next->previous();
566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  prev->next_ = this;
567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  next->previous_ = this;
568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  next_ = next;
569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  previous_ = prev;
570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetBlock(next->block());
571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertAfter(HInstruction* previous) {
575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsLinked());
576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!previous->IsControlInstruction());
577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsControlInstruction() || previous->next_ == NULL);
578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block = previous->block();
579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Never insert anything except constants into the start block after finishing
580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it.
581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (block->IsStartBlock() && block->IsFinished() && !IsConstant()) {
582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(block->end()->SecondSuccessor() == NULL);
583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    InsertAfter(block->end()->FirstSuccessor()->first());
584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // If we're inserting after an instruction with side-effects that is
588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // followed by a simulate instruction, we need to insert after the
589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // simulate instruction instead.
590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next = previous->next_;
5913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (previous->HasObservableSideEffects() && next != NULL) {
592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(next->IsSimulate());
593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    previous = next;
594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    next = previous->next_;
595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  previous_ = previous;
598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  next_ = next;
599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetBlock(block);
600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  previous->next_ = this;
601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (next != NULL) next->previous_ = this;
602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
6061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HInstruction::Verify() {
607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that input operands are defined before use.
608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* cur_block = block();
609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* other_operand = OperandAt(i);
611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HBasicBlock* other_block = other_operand->block();
612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (cur_block == other_block) {
613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (!other_operand->IsPhi()) {
6143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        HInstruction* cur = this->previous();
615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        while (cur != NULL) {
616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          if (cur == other_operand) break;
6173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          cur = cur->previous();
618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        }
619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        // Must reach other operand in the same block!
620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ASSERT(cur == other_operand);
621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      // If the following assert fires, you may have forgotten an
624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      // AddInstruction.
625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ASSERT(other_block->Dominates(cur_block));
626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that instructions that may have side-effects are followed
630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // by a simulate instruction.
6313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (HasObservableSideEffects() && !IsOsrEntry()) {
632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(next()->IsSimulate());
633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
6341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Verify that instructions that can be eliminated by GVN have overridden
6361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // HValue::DataEquals.  The default implementation is UNREACHABLE.  We
6371e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // don't actually care whether DataEquals returns true or false here.
6381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (CheckFlag(kUseGVN)) DataEquals(this);
639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
640b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
643e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryCall::PrintDataTo(StringStream* stream) {
6441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  value()->PrintNameTo(stream);
6451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
646e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
650e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryCall::PrintDataTo(StringStream* stream) {
6511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  first()->PrintNameTo(stream);
6521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
6531e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  second()->PrintNameTo(stream);
6541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
655e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
6561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
6571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
6581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
65969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid HBoundsCheck::PrintDataTo(StringStream* stream) {
66069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  index()->PrintNameTo(stream);
66169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  stream->Add(" ");
66269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  length()->PrintNameTo(stream);
66369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
66469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
66569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
666e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallConstantFunction::PrintDataTo(StringStream* stream) {
6671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (IsApplyFunction()) {
6681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    stream->Add("optimized apply ");
6691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
6701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    stream->Add("%o ", function()->shared()->DebugName());
671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
672e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
676e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallNamed::PrintDataTo(StringStream* stream) {
6771e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%o ", *name());
6781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall::PrintDataTo(stream);
679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
682e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallGlobal::PrintDataTo(StringStream* stream) {
6831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%o ", *name());
6841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall::PrintDataTo(stream);
685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
687b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
688e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallKnownGlobal::PrintDataTo(StringStream* stream) {
6891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("o ", target()->shared()->DebugName());
690e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallRuntime::PrintDataTo(StringStream* stream) {
6951e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%o ", *name());
696e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
699b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7003fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HClassOfTestAndBranch::PrintDataTo(StringStream* stream) {
7011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("class_of_test(");
702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
7031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(", \"%o\")", *class_name());
704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
707e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HAccessArgumentsAt::PrintDataTo(StringStream* stream) {
7081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  arguments()->PrintNameTo(stream);
7091e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[");
7101e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  index()->PrintNameTo(stream);
7111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("], length ");
7121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  length()->PrintNameTo(stream);
713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
716e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HControlInstruction::PrintDataTo(StringStream* stream) {
7173fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add(" goto (");
7183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  bool first_block = true;
7193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (HSuccessorIterator it(this); !it.Done(); it.Advance()) {
7203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    stream->Add(first_block ? "B%d" : ", B%d", it.Current()->block_id());
7213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    first_block = false;
7221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
7233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add(")");
724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryControlInstruction::PrintDataTo(StringStream* stream) {
728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
7291e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HControlInstruction::PrintDataTo(stream);
730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HIsNilAndBranch::PrintDataTo(StringStream* stream) {
7343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintNameTo(stream);
7353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(kind() == kStrictEquality ? " === " : " == ");
7363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(nil() == kNullValue ? "null" : "undefined");
7373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HControlInstruction::PrintDataTo(stream);
7383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
7393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
7413fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HReturn::PrintDataTo(StringStream* stream) {
7423fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  value()->PrintNameTo(stream);
7433fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
7443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
7453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
746e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCompareMap::PrintDataTo(StringStream* stream) {
747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
7481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" (%p)", *map());
7491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HControlInstruction::PrintDataTo(stream);
750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HUnaryMathOperation::OpName() const {
754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (op()) {
755b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathFloor: return "floor";
756b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathRound: return "round";
757b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathCeil: return "ceil";
758b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathAbs: return "abs";
759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathLog: return "log";
760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathSin: return "sin";
761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathCos: return "cos";
762b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathTan: return "tan";
763b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathASin: return "asin";
764b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathACos: return "acos";
765b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathATan: return "atan";
766b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathExp: return "exp";
767b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathSqrt: return "sqrt";
768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    default: break;
769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return "(unknown operation)";
771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
774e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryMathOperation::PrintDataTo(StringStream* stream) {
775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* name = OpName();
776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s ", name);
777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryOperation::PrintDataTo(StringStream* stream) {
782b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
7863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HHasInstanceTypeAndBranch::PrintDataTo(StringStream* stream) {
787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (from_) {
7893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    case FIRST_JS_RECEIVER_TYPE:
790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == LAST_TYPE) stream->Add(" spec_object");
791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case JS_REGEXP_TYPE:
793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == JS_REGEXP_TYPE) stream->Add(" reg_exp");
794b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case JS_ARRAY_TYPE:
796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == JS_ARRAY_TYPE) stream->Add(" array");
797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case JS_FUNCTION_TYPE:
799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == JS_FUNCTION_TYPE) stream->Add(" function");
800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    default:
802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
8073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HTypeofIsAndBranch::PrintDataTo(StringStream* stream) {
808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
8093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" == %o", *type_literal_);
8103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HControlInstruction::PrintDataTo(stream);
8113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HCheckMapValue::PrintDataTo(StringStream* stream) {
8153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintNameTo(stream);
8163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" ");
8173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  map()->PrintNameTo(stream);
8183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HForInPrepareMap::PrintDataTo(StringStream* stream) {
8223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enumerable()->PrintNameTo(stream);
8233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HForInCacheArray::PrintDataTo(StringStream* stream) {
8273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  enumerable()->PrintNameTo(stream);
8283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" ");
8293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  map()->PrintNameTo(stream);
8303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("[%d]", idx_);
8313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HLoadFieldByIndex::PrintDataTo(StringStream* stream) {
8353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintNameTo(stream);
8363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" ");
8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  index()->PrintNameTo(stream);
8383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8413ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HConstant::Canonicalize() {
8423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HasNoUses() ? NULL : this;
8433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8463ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HTypeof::Canonicalize() {
8473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HasNoUses() ? NULL : this;
8483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8513ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HBitwise::Canonicalize() {
8523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!representation().IsInteger32()) return this;
8533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // If x is an int32, then x & -1 == x, x | 0 == x and x ^ 0 == x.
8543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int32_t nop_constant = (op() == Token::BIT_AND) ? -1 : 0;
8553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left()->IsConstant() &&
8563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HConstant::cast(left())->HasInteger32Value() &&
8573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HConstant::cast(left())->Integer32Value() == nop_constant) {
8583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return right();
8593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (right()->IsConstant() &&
8613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HConstant::cast(right())->HasInteger32Value() &&
8623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HConstant::cast(right())->Integer32Value() == nop_constant) {
8633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return left();
8643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
8663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HAdd::Canonicalize() {
8703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!representation().IsInteger32()) return this;
8713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (CheckUsesForFlag(kTruncatingToInt32)) ClearFlag(kCanOverflow);
8723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
8733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HSub::Canonicalize() {
8773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!representation().IsInteger32()) return this;
8783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (CheckUsesForFlag(kTruncatingToInt32)) ClearFlag(kCanOverflow);
8793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
8803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8833ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HChange::Canonicalize() {
8843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return (from().Equals(to())) ? value() : this;
8853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HWrapReceiver::Canonicalize() {
8893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (HasNoUses()) return NULL;
8903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (receiver()->type().IsJSObject()) {
8913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return receiver();
8923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
8933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
8943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
8953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
8973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HTypeof::PrintDataTo(StringStream* stream) {
8983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  value()->PrintNameTo(stream);
899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
902e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HChange::PrintDataTo(StringStream* stream) {
903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HUnaryOperation::PrintDataTo(stream);
9043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %s to %s", from().Mnemonic(), to().Mnemonic());
905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CanTruncateToInt32()) stream->Add(" truncating-int32");
907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?");
9083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (CheckFlag(kDeoptimizeOnUndefined)) stream->Add(" deopt-on-undefined");
909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
912589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid HJSArrayLength::PrintDataTo(StringStream* stream) {
913589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  value()->PrintNameTo(stream);
914589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  stream->Add(" ");
915589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  typecheck()->PrintNameTo(stream);
916589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
917589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
918589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
9193fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHValue* HCheckInstanceType::Canonicalize() {
9203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (check_ == IS_STRING &&
9213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      !value()->type().IsUninitialized() &&
9223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      value()->type().IsString()) {
9233fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return NULL;
9243fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
9253fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (check_ == IS_SYMBOL &&
9263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      value()->IsConstant() &&
9273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      HConstant::cast(value())->handle()->IsSymbol()) {
9283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    return NULL;
9293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
9303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return this;
9313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
9323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
9333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
934257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HCheckInstanceType::GetCheckInterval(InstanceType* first,
935257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch                                          InstanceType* last) {
936257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(is_interval_check());
937257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  switch (check_) {
9383fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    case IS_SPEC_OBJECT:
9393fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      *first = FIRST_SPEC_OBJECT_TYPE;
9403fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      *last = LAST_SPEC_OBJECT_TYPE;
941257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return;
942257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case IS_JS_ARRAY:
943257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      *first = *last = JS_ARRAY_TYPE;
944257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return;
945257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default:
946257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      UNREACHABLE();
947257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
948257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
949257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
950257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
951257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) {
952257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  ASSERT(!is_interval_check());
953257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  switch (check_) {
954257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case IS_STRING:
955257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      *mask = kIsNotStringMask;
956257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      *tag = kStringTag;
957257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return;
958257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    case IS_SYMBOL:
959257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      *mask = kIsSymbolMask;
960257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      *tag = kSymbolTag;
961257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      return;
962257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    default:
963257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      UNREACHABLE();
964257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
968e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckMap::PrintDataTo(StringStream* stream) {
969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" %p", *map());
9713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (mode() == REQUIRE_EXACT_MAP) {
9723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" [EXACT]");
9733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else if (!has_element_transitions_) {
9743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" [EXACT*]");
9753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  } else {
9763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    stream->Add(" [MATCH ELEMENTS]");
9773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
981e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckFunction::PrintDataTo(StringStream* stream) {
982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" %p", *target());
984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
9873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochconst char* HCheckInstanceType::GetCheckName() {
9883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (check_) {
9893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case IS_SPEC_OBJECT: return "object";
9903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case IS_JS_ARRAY: return "array";
9913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case IS_STRING: return "string";
9923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case IS_SYMBOL: return "symbol";
9933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
9943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  UNREACHABLE();
9953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return "";
9963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
9973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
9983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HCheckInstanceType::PrintDataTo(StringStream* stream) {
9993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("%s ", GetCheckName());
10003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HUnaryOperation::PrintDataTo(stream);
10013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
10023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
10033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1004e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallStub::PrintDataTo(StringStream* stream) {
10051e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%s ",
10061e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              CodeStub::MajorName(major_key_, false));
10071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall::PrintDataTo(stream);
1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1011e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstanceOf::PrintDataTo(StringStream* stream) {
10121e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  left()->PrintNameTo(stream);
10131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
10141e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  right()->PrintNameTo(stream);
10151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
10161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  context()->PrintNameTo(stream);
1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HValue::InferRange(Zone* zone) {
102169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  // Untagged integer32 cannot be -0, all other representations can.
10223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  Range* result = new(zone) Range();
102369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  result->set_can_be_minus_zero(!representation().IsInteger32());
102469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return result;
102569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
102669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
102769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
10283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HChange::InferRange(Zone* zone) {
102969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Range* input_range = value()->range();
103069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (from().IsInteger32() &&
103169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      to().IsTagged() &&
103269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      input_range != NULL && input_range->IsInSmiRange()) {
103369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    set_type(HType::Smi());
1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
103569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  Range* result = (input_range != NULL)
10363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? input_range->Copy(zone)
10373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HValue::InferRange(zone);
103869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (to().IsInteger32()) result->set_can_be_minus_zero(false);
103969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  return result;
1040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HConstant::InferRange(Zone* zone) {
1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (has_int32_value_) {
10453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* result = new(zone) Range(int32_value_, int32_value_);
1046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result->set_can_be_minus_zero(false);
1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
1048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
10493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HValue::InferRange(zone);
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10533ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HPhi::InferRange(Zone* zone) {
1054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
1055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (block()->IsLoopHeader()) {
10563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      Range* range = new(zone) Range(kMinInt, kMaxInt);
1057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return range;
1058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
10593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      Range* range = OperandAt(0)->range()->Copy(zone);
1060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      for (int i = 1; i < OperandCount(); ++i) {
1061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        range->Union(OperandAt(i)->range());
1062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
1063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return range;
1064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
10663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HValue::InferRange(zone);
1067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10713ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HAdd::InferRange(Zone* zone) {
1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
1073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* b = right()->range();
10753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* res = a->Copy(zone);
1076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!res->AddAndCheckOverflow(b)) {
1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(kCanOverflow);
1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool m0 = a->CanBeMinusZero() && b->CanBeMinusZero();
1080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    res->set_can_be_minus_zero(m0);
1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
10833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HValue::InferRange(zone);
1084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10883ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HSub::InferRange(Zone* zone) {
1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
1090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
1091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* b = right()->range();
10923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* res = a->Copy(zone);
1093b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!res->SubAndCheckOverflow(b)) {
1094b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(kCanOverflow);
1095b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1096b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    res->set_can_be_minus_zero(a->CanBeMinusZero() && b->CanBeZero());
1097b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
1098b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
10993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HValue::InferRange(zone);
1100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
11043ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HMul::InferRange(Zone* zone) {
1105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
1106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
1107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* b = right()->range();
11083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* res = a->Copy(zone);
1109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!res->MulAndCheckOverflow(b)) {
1110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(kCanOverflow);
1111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool m0 = (a->CanBeZero() && b->CanBeNegative()) ||
1113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        (a->CanBeNegative() && b->CanBeZero());
1114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    res->set_can_be_minus_zero(m0);
1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
1116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
11173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HValue::InferRange(zone);
1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
11223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HDiv::InferRange(Zone* zone) {
1123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
11243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* result = new(zone) Range();
1125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->range()->CanBeMinusZero()) {
1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->set_can_be_minus_zero(true);
1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1128b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->range()->CanBeZero() && right()->range()->CanBeNegative()) {
1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->set_can_be_minus_zero(true);
1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (right()->range()->Includes(-1) && left()->range()->Includes(kMinInt)) {
1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(HValue::kCanOverflow);
1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1136b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1137b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!right()->range()->CanBeZero()) {
1138b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(HValue::kCanBeDivByZero);
1139b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
11423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HValue::InferRange(zone);
1143b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
11473ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HMod::InferRange(Zone* zone) {
1148b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
11503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    Range* result = new(zone) Range();
1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (a->CanBeMinusZero() || a->CanBeNegative()) {
1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->set_can_be_minus_zero(true);
1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!right()->range()->CanBeZero()) {
1155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(HValue::kCanBeDivByZero);
1156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
1158b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
11593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return HValue::InferRange(zone);
1160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1162b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1164e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HPhi::PrintTo(StringStream* stream) {
1165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[");
1166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* value = OperandAt(i);
1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" ");
1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    value->PrintNameTo(stream);
1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" ");
1171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1172589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  stream->Add(" uses%d_%di_%dd_%dt",
1173257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch              UseCount(),
1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              int32_non_phi_uses() + int32_indirect_uses(),
1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              double_non_phi_uses() + double_indirect_uses(),
1176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              tagged_non_phi_uses() + tagged_indirect_uses());
1177589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  stream->Add("%s%s]",
1178589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch              is_live() ? "_live" : "",
1179589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch              IsConvertibleToInteger() ? "" : "_ncti");
1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddInput(HValue* value) {
1184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  inputs_.Add(NULL);
1185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetOperandAt(OperandCount() - 1, value);
1186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Mark phis that may have 'arguments' directly or indirectly as an operand.
1187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) {
1188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kIsArguments);
1189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
119344f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HPhi::HasRealUses() {
1194257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
1195257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!it.value()->IsPhi()) return true;
119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return false;
119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1201e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHValue* HPhi::GetRedundantReplacement() {
1202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue* candidate = NULL;
1203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int count = OperandCount();
1204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position = 0;
1205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  while (position < count && candidate == NULL) {
1206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* current = OperandAt(position++);
1207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (current != this) candidate = current;
1208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  while (position < count) {
1210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* current = OperandAt(position++);
1211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (current != this && current != candidate) return NULL;
1212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(candidate != this);
1214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return candidate;
1215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::DeleteFromGraph() {
1219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(block() != NULL);
1220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  block()->RemovePhi(this);
1221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(block() == NULL);
1222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::InitRealUses(int phi_id) {
1226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Initialize real uses.
1227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  phi_id_ = phi_id;
1228257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
1229257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HValue* value = it.value();
1230257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!value->IsPhi()) {
1231257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      Representation rep = value->RequiredInputRepresentation(it.index());
12323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      non_phi_uses_[rep.kind()] += value->LoopWeight();
1233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddNonPhiUsesFrom(HPhi* other) {
1239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < Representation::kNumRepresentations; i++) {
1240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    indirect_uses_[i] += other->non_phi_uses_[i];
1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddIndirectUsesTo(int* dest) {
1246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < Representation::kNumRepresentations; i++) {
1247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    dest[i] += indirect_uses_[i];
1248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1252e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HSimulate::PrintDataTo(StringStream* stream) {
12533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add("id=%d", ast_id());
12543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (pop_count_ > 0) stream->Add(" pop %d", pop_count_);
1255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (values_.length() > 0) {
1256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (pop_count_ > 0) stream->Add(" /");
1257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < values_.length(); ++i) {
12583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (i > 0) stream->Add(",");
12593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (HasAssignedIndexAt(i)) {
126085b71799222b55eb5dd74ea26efe0c64ab655c8cBen Murdoch        stream->Add(" var[%d] = ", GetAssignedIndexAt(i));
12613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
12623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        stream->Add(" push ");
1263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
1264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      values_[i]->PrintNameTo(stream);
1265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
12703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HDeoptimize::PrintDataTo(StringStream* stream) {
12713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (OperandCount() == 0) return;
12723fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  OperandAt(0)->PrintNameTo(stream);
12733fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  for (int i = 1; i < OperandCount(); ++i) {
12743fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    stream->Add(" ");
12753fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    OperandAt(i)->PrintNameTo(stream);
12763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  }
12773fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
12783fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
12793fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1280e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HEnterInlined::PrintDataTo(StringStream* stream) {
1281589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  SmartArrayPointer<char> name = function()->debug_name()->ToCString();
1282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s, id=%d", *name, function()->id());
1283b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant::HConstant(Handle<Object> handle, Representation r)
1287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    : handle_(handle),
1288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      has_int32_value_(false),
1289053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block      has_double_value_(false),
1290257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      int32_value_(0),
1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      double_value_(0)  {
1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  set_representation(r);
1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetFlag(kUseGVN);
1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (handle_->IsNumber()) {
1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    double n = handle_->Number();
1296b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    double roundtrip_value = static_cast<double>(static_cast<int32_t>(n));
1297b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    has_int32_value_ = BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(n);
1298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (has_int32_value_) int32_value_ = static_cast<int32_t>(n);
1299b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    double_value_ = n;
1300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    has_double_value_ = true;
1301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToRepresentation(Representation r) const {
1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (r.IsInteger32() && !has_int32_value_) return NULL;
1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (r.IsDouble() && !has_double_value_) return NULL;
1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return new HConstant(handle_, r);
1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToTruncatedInt32() const {
1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!has_double_value_) return NULL;
1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t truncated = NumberToInt32(*handle_);
131544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return new HConstant(FACTORY->NewNumberFromInt(truncated),
1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                       Representation::Integer32());
1317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13208b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool HConstant::ToBoolean() const {
13218b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts the constant's boolean value according to
13228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // ECMAScript section 9.2 ToBoolean conversion.
13238b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (HasInteger32Value()) return Integer32Value() != 0;
13248b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (HasDoubleValue()) {
13258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    double v = DoubleValue();
13268b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return v != 0 && !isnan(v);
13278b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
13288b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsTrue()) return true;
13298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsFalse()) return false;
13308b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsUndefined()) return false;
13318b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsNull()) return false;
13328b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsString() &&
13338b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      String::cast(*handle())->length() == 0) return false;
13348b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return true;
13358b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
13368b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HConstant::PrintDataTo(StringStream* stream) {
1338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  handle()->ShortPrint(stream);
1339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HArrayLiteral::IsCopyOnWrite() const {
13433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!boilerplate_object_->IsJSObject()) return false;
13443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Handle<JSObject>::cast(boilerplate_object_)->elements()->map() ==
13453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HEAP->fixed_cow_array_map();
1346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1349e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryOperation::PrintDataTo(StringStream* stream) {
1350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  left()->PrintNameTo(stream);
1351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" ");
1352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  right()->PrintNameTo(stream);
1353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CheckFlag(kCanOverflow)) stream->Add(" !");
1354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?");
1355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13583ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HBitwise::InferRange(Zone* zone) {
13593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (op() == Token::BIT_XOR) return HValue::InferRange(zone);
13603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  const int32_t kDefaultMask = static_cast<int32_t>(0xffffffff);
1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t left_mask = (left()->range() != NULL)
1362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? left()->range()->Mask()
13633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : kDefaultMask;
1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t right_mask = (right()->range() != NULL)
1365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? right()->range()->Mask()
13663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : kDefaultMask;
13673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  int32_t result_mask = (op() == Token::BIT_AND)
13683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? left_mask & right_mask
13693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : left_mask | right_mask;
1370e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return (result_mask >= 0)
13713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      ? new(zone) Range(0, result_mask)
13723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      : HValue::InferRange(zone);
1373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13763ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HSar::InferRange(Zone* zone) {
1377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (right()->IsConstant()) {
1378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* c = HConstant::cast(right());
1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (c->HasInteger32Value()) {
1380e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      Range* result = (left()->range() != NULL)
13813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          ? left()->range()->Copy(zone)
13823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          : new(zone) Range();
1383e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result->Sar(c->Integer32Value());
138469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      result->set_can_be_minus_zero(false);
1385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return result;
1386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
13883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HValue::InferRange(zone);
1389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13923ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HShr::InferRange(Zone* zone) {
139369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  if (right()->IsConstant()) {
139469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    HConstant* c = HConstant::cast(right());
139569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    if (c->HasInteger32Value()) {
139669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      int shift_count = c->Integer32Value() & 0x1f;
139769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      if (left()->range()->CanBeNegative()) {
139869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        // Only compute bounds if the result always fits into an int32.
139969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        return (shift_count >= 1)
14003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            ? new(zone) Range(0,
14013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                              static_cast<uint32_t>(0xffffffff) >> shift_count)
14023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            : new(zone) Range();
140369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      } else {
140469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        // For positive inputs we can use the >> operator.
140569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        Range* result = (left()->range() != NULL)
14063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            ? left()->range()->Copy(zone)
14073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            : new(zone) Range();
140869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        result->Sar(c->Integer32Value());
140969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        result->set_can_be_minus_zero(false);
141069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch        return result;
141169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      }
141269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch    }
141369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  }
14143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HValue::InferRange(zone);
141569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
141669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
141769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
14183ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HShl::InferRange(Zone* zone) {
1419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (right()->IsConstant()) {
1420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* c = HConstant::cast(right());
1421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (c->HasInteger32Value()) {
1422e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      Range* result = (left()->range() != NULL)
14233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          ? left()->range()->Copy(zone)
14243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          : new(zone) Range();
1425e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result->Shl(c->Integer32Value());
142669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch      result->set_can_be_minus_zero(false);
1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return result;
1428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
14303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HValue::InferRange(zone);
1431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14343ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRange* HLoadKeyedSpecializedArrayElement::InferRange(Zone* zone) {
14353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  switch (elements_kind()) {
14363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case EXTERNAL_PIXEL_ELEMENTS:
14373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return new(zone) Range(0, 255);
14383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case EXTERNAL_BYTE_ELEMENTS:
14393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return new(zone) Range(-128, 127);
14403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
14413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return new(zone) Range(0, 255);
14423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case EXTERNAL_SHORT_ELEMENTS:
14433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return new(zone) Range(-32768, 32767);
14443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
14453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return new(zone) Range(0, 65535);
14463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    default:
14473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return HValue::InferRange(zone);
14483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
14493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14523fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HCompareGeneric::PrintDataTo(StringStream* stream) {
1453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(Token::Name(token()));
1454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" ");
1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBinaryOperation::PrintDataTo(stream);
1456b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
14593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HStringCompareAndBranch::PrintDataTo(StringStream* stream) {
14603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(Token::Name(token()));
14613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" ");
14623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HControlInstruction::PrintDataTo(stream);
14633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14663fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HCompareIDAndBranch::PrintDataTo(StringStream* stream) {
14673fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add(Token::Name(token()));
14683fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add(" ");
14693fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  left()->PrintNameTo(stream);
14703fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add(" ");
14713fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  right()->PrintNameTo(stream);
1472589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  HControlInstruction::PrintDataTo(stream);
1473589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch}
1474589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
1475589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch
14763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HCompareObjectEqAndBranch::PrintDataTo(StringStream* stream) {
14773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  left()->PrintNameTo(stream);
14783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" ");
14793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  right()->PrintNameTo(stream);
14803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  HControlInstruction::PrintDataTo(stream);
14813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
14823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
14833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1484589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdochvoid HGoto::PrintDataTo(StringStream* stream) {
1485589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch  stream->Add("B%d", SuccessorAt(0)->block_id());
14863fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
14873fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14883fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
14893fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HCompareIDAndBranch::SetInputRepresentation(Representation r) {
1490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  input_representation_ = r;
14913fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  if (r.IsDouble()) {
14923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // According to the ES5 spec (11.9.3, 11.8.5), Equality comparisons (==, ===
14933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // and !=) have special handling of undefined, e.g. undefined == undefined
14943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // is 'true'. Relational comparisons have a different semantic, first
14953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // calling ToPrimitive() on their arguments.  The standard Crankshaft
14963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // tagged-to-double conversion to ensure the HCompareIDAndBranch's inputs
14973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // are doubles caused 'undefined' to be converted to NaN. That's compatible
14983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // out-of-the box with ordered relational comparisons (<, >, <=,
14993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // >=). However, for equality comparisons (and for 'in' and 'instanceof'),
15003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // it is not consistent with the spec. For example, it would cause undefined
15013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // == undefined (should be true) to be evaluated as NaN == NaN
15023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // (false). Therefore, any comparisons other than ordered relational
15033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // comparisons must cause a deopt when one of their arguments is undefined.
15043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    // See also v8:1434
15053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!Token::IsOrderedRelationalCompareOp(token_)) {
15063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      SetFlag(kDeoptimizeOnUndefined);
15073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
1508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
15093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    ASSERT(r.IsInteger32());
1510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1514e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HParameter::PrintDataTo(StringStream* stream) {
1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%u", index());
1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1519e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadNamedField::PrintDataTo(StringStream* stream) {
1520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : "");
1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15253fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* context,
15263fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch                                                       HValue* object,
152769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch                                                       SmallMapList* types,
152844f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                                       Handle<String> name)
15293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch    : types_(Min(types->length(), kMaxLoadPolymorphism)),
153044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      name_(name),
153144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      need_generic_(false) {
15323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  SetOperandAt(0, context);
15333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  SetOperandAt(1, object);
153444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  set_representation(Representation::Tagged());
15353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  SetGVNFlag(kDependsOnMaps);
153644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0;
153744f0eee88ff00398ff7f715fab053374d808c90dSteve Block       i < types->length() && types_.length() < kMaxLoadPolymorphism;
153844f0eee88ff00398ff7f715fab053374d808c90dSteve Block       ++i) {
153944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Handle<Map> map = types->at(i);
15403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    LookupResult lookup(map->GetIsolate());
154144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    map->LookupInDescriptors(NULL, *name, &lookup);
15423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (lookup.IsFound()) {
1543257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      switch (lookup.type()) {
1544257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        case FIELD: {
1545257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          int index = lookup.GetLocalFieldIndexFromMap(*map);
1546257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          if (index < 0) {
15473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            SetGVNFlag(kDependsOnInobjectFields);
1548257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          } else {
15493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            SetGVNFlag(kDependsOnBackingStoreFields);
1550257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          }
1551257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          types_.Add(types->at(i));
1552257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          break;
1553257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        }
1554257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        case CONSTANT_FUNCTION:
1555257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          types_.Add(types->at(i));
1556257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          break;
1557257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch        default:
1558257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch          break;
155944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
156044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
156144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
156244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
156344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (types_.length() == types->length() && FLAG_deoptimize_uncommon_cases) {
156444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kUseGVN);
156544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else {
156644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetAllSideEffects();
156744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    need_generic_ = true;
156844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
156944f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
157044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
157144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
157244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) {
157344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value);
157444f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (types_.length() != other->types()->length()) return false;
157544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (!name_.is_identical_to(other->name())) return false;
157644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (need_generic_ != other->need_generic_) return false;
157744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0; i < types_.length(); i++) {
157844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    bool found = false;
157944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    for (int j = 0; j < types_.length(); j++) {
158044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      if (types_.at(j).is_identical_to(other->types()->at(i))) {
158144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        found = true;
158244f0eee88ff00398ff7f715fab053374d808c90dSteve Block        break;
158344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
158444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
158544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (!found) return false;
158644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
158744f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return true;
158844f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
158944f0eee88ff00398ff7f715fab053374d808c90dSteve Block
159044f0eee88ff00398ff7f715fab053374d808c90dSteve Block
159169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid HLoadNamedFieldPolymorphic::PrintDataTo(StringStream* stream) {
159269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  object()->PrintNameTo(stream);
15933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(".");
159469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
159569a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
159669a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
159769a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
159869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdochvoid HLoadNamedGeneric::PrintDataTo(StringStream* stream) {
159969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  object()->PrintNameTo(stream);
16003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(".");
160169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
160269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch}
160369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
160469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch
1605e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[");
1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  key()->PrintNameTo(stream);
1609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("]");
1610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool HLoadKeyedFastElement::RequiresHoleCheck() {
16143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (hole_check_mode_ == OMIT_HOLE_CHECK) {
16153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    return false;
16163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
16173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1618257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
1619257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    HValue* use = it.value();
1620257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    if (!use->IsChange()) return true;
1621257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  }
16223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1623257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return false;
1624257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
1625257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
1626257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
16273fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HLoadKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
16283fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elements()->PrintNameTo(stream);
16293fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("[");
16303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  key()->PrintNameTo(stream);
16313fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("]");
16323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
16333fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
16343fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1635e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedGeneric::PrintDataTo(StringStream* stream) {
1636e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintNameTo(stream);
1637e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
1638e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintNameTo(stream);
1639e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("]");
1640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1641e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1642e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
16433ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHValue* HLoadKeyedGeneric::Canonicalize() {
16443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // Recognize generic keyed loads that use property name generated
16453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // by for-in statement as a key and rewrite them into fast property load
16463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // by index.
16473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (key()->IsLoadKeyedFastElement()) {
16483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HLoadKeyedFastElement* key_load = HLoadKeyedFastElement::cast(key());
16493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (key_load->object()->IsForInCacheArray()) {
16503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HForInCacheArray* names_cache =
16513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          HForInCacheArray::cast(key_load->object());
16523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (names_cache->enumerable() == object()) {
16543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        HForInCacheArray* index_cache =
16553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            names_cache->index_cache();
16563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        HCheckMapValue* map_check =
16573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            new(block()->zone()) HCheckMapValue(object(), names_cache->map());
16583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        HInstruction* index = new(block()->zone()) HLoadKeyedFastElement(
16593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            index_cache,
16603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            key_load->key(),
16613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            HLoadKeyedFastElement::OMIT_HOLE_CHECK);
16623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex(
16633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            object(), index);
16643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        map_check->InsertBefore(this);
16653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        index->InsertBefore(this);
16663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        load->InsertBefore(this);
16673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return load;
16683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
16693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
16703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
16713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return this;
16733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
16743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
16753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
167644f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HLoadKeyedSpecializedArrayElement::PrintDataTo(
167744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StringStream* stream) {
16781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  external_pointer()->PrintNameTo(stream);
167944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  stream->Add(".");
16803fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  switch (elements_kind()) {
1681589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_BYTE_ELEMENTS:
168244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("byte");
168344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1684589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
168544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_byte");
168644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1687589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_SHORT_ELEMENTS:
168844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("short");
168944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1690589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
169144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_short");
169244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1693589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_INT_ELEMENTS:
169444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("int");
169544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1696589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_UNSIGNED_INT_ELEMENTS:
169744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_int");
169844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1699589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_FLOAT_ELEMENTS:
170044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("float");
170144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1702589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_DOUBLE_ELEMENTS:
1703257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      stream->Add("double");
1704257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
1705589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_PIXEL_ELEMENTS:
170644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("pixel");
170744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1708589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case FAST_ELEMENTS:
17093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case FAST_SMI_ONLY_ELEMENTS:
1710589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case FAST_DOUBLE_ELEMENTS:
1711589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case DICTIONARY_ELEMENTS:
1712589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case NON_STRICT_ARGUMENTS_ELEMENTS:
17133fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      UNREACHABLE();
17143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      break;
171544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
17161e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[");
17171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  key()->PrintNameTo(stream);
17181e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("]");
17191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
17201e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
17211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1722e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedGeneric::PrintDataTo(StringStream* stream) {
1723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(".");
1725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(name()->IsString());
1726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(*String::cast(*name())->ToCString());
1727b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" = ");
1728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
1729b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1732e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedField::PrintDataTo(StringStream* stream) {
1733e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintNameTo(stream);
1734e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(".");
1735e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
1736e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(" = ");
1737e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintNameTo(stream);
17383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : "");
1739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!transition().is_null()) {
1740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" (transition map %p)", *transition());
1741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1743b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1745e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
1746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[");
1748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  key()->PrintNameTo(stream);
1749b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("] = ");
1750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
1751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
17543fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdochvoid HStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
17553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  elements()->PrintNameTo(stream);
17563fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("[");
17573fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  key()->PrintNameTo(stream);
17583fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  stream->Add("] = ");
17593fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  value()->PrintNameTo(stream);
17603fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
17613fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
17623fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
1763e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
1764e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintNameTo(stream);
1765e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
1766e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintNameTo(stream);
1767e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("] = ");
1768e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintNameTo(stream);
1769e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1770e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1771e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
177244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HStoreKeyedSpecializedArrayElement::PrintDataTo(
177344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StringStream* stream) {
1774e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  external_pointer()->PrintNameTo(stream);
177544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  stream->Add(".");
17763fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  switch (elements_kind()) {
1777589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_BYTE_ELEMENTS:
177844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("byte");
177944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1780589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
178144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_byte");
178244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1783589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_SHORT_ELEMENTS:
178444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("short");
178544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1786589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
178744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_short");
178844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1789589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_INT_ELEMENTS:
179044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("int");
179144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1792589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_UNSIGNED_INT_ELEMENTS:
179344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_int");
179444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1795589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_FLOAT_ELEMENTS:
179644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("float");
179744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
1798589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_DOUBLE_ELEMENTS:
1799257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      stream->Add("double");
1800257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch      break;
1801589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case EXTERNAL_PIXEL_ELEMENTS:
180244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("pixel");
180344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
18043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    case FAST_SMI_ONLY_ELEMENTS:
1805589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case FAST_ELEMENTS:
1806589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case FAST_DOUBLE_ELEMENTS:
1807589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case DICTIONARY_ELEMENTS:
1808589d6979ff2ef66fca2d8fa51404c369ca5e9250Ben Murdoch    case NON_STRICT_ARGUMENTS_ELEMENTS:
18093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      UNREACHABLE();
18103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch      break;
181144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1812e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
1813e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintNameTo(stream);
1814e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("] = ");
1815e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintNameTo(stream);
1816e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1817e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1818e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
18193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochvoid HTransitionElementsKind::PrintDataTo(StringStream* stream) {
18203ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  object()->PrintNameTo(stream);
18213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  stream->Add(" %p -> %p", *original_map(), *transitioned_map());
18223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18258b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalCell::PrintDataTo(StringStream* stream) {
1826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[%p]", *cell());
18273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!details_.IsDontDelete()) stream->Add(" (deleteable)");
18283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (details_.IsReadOnly()) stream->Add(" (read-only)");
18293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
18303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
18323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochbool HLoadGlobalCell::RequiresHoleCheck() {
18333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (details_.IsDontDelete() && !details_.IsReadOnly()) return false;
18343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
18353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HValue* use = it.value();
18363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (!use->IsChange()) return true;
18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
18383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return false;
1839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18428b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalGeneric::PrintDataTo(StringStream* stream) {
18438b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  stream->Add("%o ", *name());
18448b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
18458b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
18468b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
18478b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalCell::PrintDataTo(StringStream* stream) {
1848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[%p] = ", *cell());
1849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
18503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (!details_.IsDontDelete()) stream->Add(" (deleteable)");
18513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (details_.IsReadOnly()) stream->Add(" (read-only)");
1852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
18558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalGeneric::PrintDataTo(StringStream* stream) {
18568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  stream->Add("%o = ", *name());
18578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  value()->PrintNameTo(stream);
18588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
18598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
18608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1861e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadContextSlot::PrintDataTo(StringStream* stream) {
18621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  value()->PrintNameTo(stream);
18631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d]", slot_index());
18641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
18651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
18661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1867e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreContextSlot::PrintDataTo(StringStream* stream) {
18681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  context()->PrintNameTo(stream);
18691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d] = ", slot_index());
18701e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  value()->PrintNameTo(stream);
1871b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1872b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1873b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Implementation of type inference and type conversions. Calculates
1875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// the inferred type of this instruction based on the input operands.
1876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1877e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HValue::CalculateInferredType() {
1878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return type_;
1879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1882e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckMap::CalculateInferredType() {
1883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return value()->type();
1884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckFunction::CalculateInferredType() {
1888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return value()->type();
1889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1892e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckNonSmi::CalculateInferredType() {
1893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(kasperl): Is there any way to signal that this isn't a smi?
1894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Tagged();
1895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1898e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckSmi::CalculateInferredType() {
1899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Smi();
1900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1903e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HPhi::CalculateInferredType() {
1904b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType result = HType::Uninitialized();
1905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
1906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HType current = OperandAt(i)->type();
1907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = result.Combine(current);
1908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1909b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
1910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1913e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HConstant::CalculateInferredType() {
1914257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return HType::TypeFromValue(handle_);
1915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19183fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HCompareGeneric::CalculateInferredType() {
19193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch  return HType::Boolean();
19203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch}
19213fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19223fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch
19233fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HInstanceOf::CalculateInferredType() {
1924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Boolean();
1925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19283fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HDeleteProperty::CalculateInferredType() {
1929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Boolean();
1930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19333fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHType HInstanceOfKnownGlobal::CalculateInferredType() {
1934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Boolean();
1935b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1936b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1937b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19383ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HChange::CalculateInferredType() {
19393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (from().IsDouble() && to().IsTagged()) return HType::HeapNumber();
19403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return type();
19413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
1944e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitwiseBinaryOperation::CalculateInferredType() {
19451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return HType::TaggedNumber();
19461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
19471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
19481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1949e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HArithmeticBinaryOperation::CalculateInferredType() {
1950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1954e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HAdd::CalculateInferredType() {
1955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Tagged();
1956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19593ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HBitNot::CalculateInferredType() {
1960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19643ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HUnaryMathOperation::CalculateInferredType() {
1965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19693ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HStringCharFromCode::CalculateInferredType() {
19703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::String();
1971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19743ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HAllocateObject::CalculateInferredType() {
19753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::JSObject();
1976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19793ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HFastLiteral::CalculateInferredType() {
19803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // TODO(mstarzinger): Be smarter, could also be JSArray here.
19813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::JSObject();
19825d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch}
19835d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
19845d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0bBen Murdoch
19853ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HArrayLiteral::CalculateInferredType() {
19863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::JSArray();
1987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19903ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HObjectLiteral::CalculateInferredType() {
19913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::JSObject();
1992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
19953ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HRegExpLiteral::CalculateInferredType() {
19963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::JSObject();
19973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
19983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
19993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHType HFunctionLiteral::CalculateInferredType() {
20013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return HType::JSObject();
2002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HUnaryMathOperation::EnsureAndPropagateNotMinusZero(
2006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    BitVector* visited) {
2007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32() &&
2009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      !value()->representation().IsInteger32()) {
2010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (value()->range() == NULL || value()->range()->CanBeMinusZero()) {
2011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kBailoutOnMinusZero);
2012b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
2013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (RequiredInputRepresentation(0).IsInteger32() &&
2015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      representation().IsInteger32()) {
2016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return value();
2017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2020b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2022b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2023b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HChange::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (from().IsInteger32()) return NULL;
2026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CanTruncateToInt32()) return NULL;
2027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (value()->range() == NULL || value()->range()->CanBeMinusZero()) {
2028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
2029b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2030b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!from().IsInteger32() || !to().IsInteger32());
2031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2035257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHValue* HForceRepresentation::EnsureAndPropagateNotMinusZero(
2036257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch    BitVector* visited) {
2037257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  visited->Add(id());
2038257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  return value();
2039257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2040257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2041257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMod::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
2045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
2046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
2047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2048b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HDiv::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2053b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2054b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
2055b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
2056b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2057b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2058b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2059b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2060b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2061b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMul::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2062b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2063b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
2064b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
2065b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2066b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2067b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2068b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2069b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2070b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HSub::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Propagate to the left argument. If the left argument cannot be -0, then
2073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the result of the add operation cannot be either.
2074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
2075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
2076b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2080b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) {
2082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
2083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Propagate to the left argument. If the left argument cannot be -0, then
2084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the result of the sub operation cannot be either.
2085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
2086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
2087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
2089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2090b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2091b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
20923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define H_CONSTANT_INT32(val)                                                  \
20933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnew(zone) HConstant(FACTORY->NewNumberFromInt(val, TENURED),                   \
20943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    Representation::Integer32())
20953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define H_CONSTANT_DOUBLE(val)                                                 \
20963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochnew(zone) HConstant(FACTORY->NewNumber(val, TENURED),                          \
20973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                    Representation::Double())
20983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
20993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op)                       \
21003ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HInstr::New##HInstr(Zone* zone,                                  \
21013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  HValue* context,                             \
21023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  HValue* left,                                \
21033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  HValue* right) {                             \
21043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left->IsConstant() && right->IsConstant()) {                             \
21053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_left = HConstant::cast(left);                                 \
21063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_right = HConstant::cast(right);                               \
21073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {             \
21083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      double double_res = c_left->DoubleValue() op c_right->DoubleValue();     \
21093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (TypeInfo::IsInt32Double(double_res)) {                               \
21103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return H_CONSTANT_INT32(static_cast<int32_t>(double_res));             \
21113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }                                                                        \
21123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return H_CONSTANT_DOUBLE(double_res);                                    \
21133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                                          \
21143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }                                                                            \
21153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone) HInstr(context, left, right);                               \
21163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21193ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +)
21203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *)
21213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -)
21223ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR
21243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21263ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HMod::NewHMod(Zone* zone,
21273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* context,
21283ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* left,
21293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* right) {
21303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left->IsConstant() && right->IsConstant()) {
21313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_left = HConstant::cast(left);
21323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_right = HConstant::cast(right);
21333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) {
21343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t dividend = c_left->Integer32Value();
21353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t divisor = c_right->Integer32Value();
21363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (divisor != 0) {
21373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        int32_t res = dividend % divisor;
21383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if ((res == 0) && (dividend < 0)) {
21393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          return H_CONSTANT_DOUBLE(-0.0);
21403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
21413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return H_CONSTANT_INT32(res);
21423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
21433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
21443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone) HMod(context, left, right);
21463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21493ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HDiv::NewHDiv(Zone* zone,
21503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* context,
21513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* left,
21523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* right) {
21533ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  // If left and right are constant values, try to return a constant value.
21543ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left->IsConstant() && right->IsConstant()) {
21553ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_left = HConstant::cast(left);
21563ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_right = HConstant::cast(right);
21573ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (c_right->DoubleValue() != 0) {
21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        double double_res = c_left->DoubleValue() / c_right->DoubleValue();
21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (TypeInfo::IsInt32Double(double_res)) {
21613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          return H_CONSTANT_INT32(static_cast<int32_t>(double_res));
21623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
21633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return H_CONSTANT_DOUBLE(double_res);
21643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
21653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
21663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
21673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone) HDiv(context, left, right);
21683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
21693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
21713ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HBitwise::NewHBitwise(Zone* zone,
21723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    Token::Value op,
21733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    HValue* context,
21743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    HValue* left,
21753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                    HValue* right) {
21763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left->IsConstant() && right->IsConstant()) {
21773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_left = HConstant::cast(left);
21783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_right = HConstant::cast(right);
21793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
21803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t result;
21813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t v_left = c_left->NumberValueAsInteger32();
21823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t v_right = c_right->NumberValueAsInteger32();
21833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      switch (op) {
21843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case Token::BIT_XOR:
21853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          result = v_left ^ v_right;
21863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          break;
21873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case Token::BIT_AND:
21883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          result = v_left & v_right;
21893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          break;
21903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        case Token::BIT_OR:
21913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          result = v_left | v_right;
21923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          break;
21933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        default:
21943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          result = 0;  // Please the compiler.
21953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          UNREACHABLE();
21963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
21973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return H_CONSTANT_INT32(result);
21983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
21993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22003ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone) HBitwise(op, context, left, right);
22013ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result)                             \
22053ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HInstr::New##HInstr(Zone* zone,                                  \
22063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  HValue* context,                             \
22073ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  HValue* left,                                \
22083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                                  HValue* right) {                             \
22093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left->IsConstant() && right->IsConstant()) {                             \
22103ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_left = HConstant::cast(left);                                 \
22113ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_right = HConstant::cast(right);                               \
22123ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {             \
22133ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return H_CONSTANT_INT32(result);                                         \
22143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }                                                                          \
22153ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }                                                                            \
22163ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone) HInstr(context, left, right);                               \
22173ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22183ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22193ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22203ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_BITWISE_INSTR(HSar,
22213ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochc_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f))
22223ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochDEFINE_NEW_H_BITWISE_INSTR(HShl,
22233ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdochc_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f))
22243ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22253ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef DEFINE_NEW_H_BITWISE_INSTR
22263ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22273ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22283ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHInstruction* HShr::NewHShr(Zone* zone,
22293ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* context,
22303ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* left,
22313ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch                            HValue* right) {
22323ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (left->IsConstant() && right->IsConstant()) {
22333ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_left = HConstant::cast(left);
22343ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HConstant* c_right = HConstant::cast(right);
22353ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
22363ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t left_val = c_left->NumberValueAsInteger32();
22373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f;
22383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if ((right_val == 0) && (left_val < 0)) {
22393ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return H_CONSTANT_DOUBLE(
22403ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch            static_cast<double>(static_cast<uint32_t>(left_val)));
22413ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
22423ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      return H_CONSTANT_INT32(static_cast<uint32_t>(left_val) >> right_val);
22433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
22443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return new(zone) HShr(context, left, right);
22463ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22473ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22483ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22493ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef H_CONSTANT_INT32
22503ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch#undef H_CONSTANT_DOUBLE
22513ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22523ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2253257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdochvoid HIn::PrintDataTo(StringStream* stream) {
2254257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  key()->PrintNameTo(stream);
2255257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  stream->Add(" ");
2256257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch  object()->PrintNameTo(stream);
2257257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch}
2258257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
2259257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch
22603ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochRepresentation HPhi::InferredRepresentation() {
22613ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool double_occurred = false;
22623ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  bool int32_occurred = false;
22633ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  for (int i = 0; i < OperandCount(); ++i) {
22643ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    HValue* value = OperandAt(i);
22653ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (value->IsUnknownOSRValue()) {
22663ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      HPhi* hint_value = HUnknownOSRValue::cast(value)->incoming_value();
22673ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (hint_value != NULL) {
22683ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        Representation hint = hint_value->representation();
22693ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (hint.IsDouble()) double_occurred = true;
22703ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (hint.IsInteger32()) int32_occurred = true;
22713ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
22723ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      continue;
22733ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
22743ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (value->representation().IsDouble()) double_occurred = true;
22753ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (value->representation().IsInteger32()) int32_occurred = true;
22763ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    if (value->representation().IsTagged()) {
22773ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      if (value->IsConstant()) {
22783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        HConstant* constant = HConstant::cast(value);
22793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        if (constant->IsConvertibleToInteger()) {
22803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          int32_occurred = true;
22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        } else if (constant->HasNumberValue()) {
22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          double_occurred = true;
22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        } else {
22843ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch          return Representation::Tagged();
22853ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        }
22863ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      } else {
22873ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch        return Representation::Tagged();
22883ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch      }
22893ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch    }
22903ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  }
22913ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22923ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (double_occurred) return Representation::Double();
22933ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22943ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  if (int32_occurred) return Representation::Integer32();
22953ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22963ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch  return Representation::None();
22973ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch}
22983ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
22993ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch
2300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Node-specific verification code is only included in debug mode.
2301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
2302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23031e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HPhi::Verify() {
2304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(OperandCount() == block()->predecessors()->length());
2305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
2306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* value = OperandAt(i);
2307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HBasicBlock* defining_block = value->block();
2308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HBasicBlock* predecessor_block = block()->predecessors()->at(i);
2309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(defining_block == predecessor_block ||
2310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           defining_block->Dominates(predecessor_block));
2311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
2312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23151e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HSimulate::Verify() {
2316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
2317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasAstId());
2318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23211e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckSmi::Verify() {
2322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
2323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
2324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckNonSmi::Verify() {
2328b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
2329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
2330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckFunction::Verify() {
2334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
2335b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
2336b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2337b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2338b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
23391e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckPrototypeMaps::Verify() {
2340b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
2341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
2342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
2343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
2345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
2346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
2347