11e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block// Copyright 2011 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";
63e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    case kNumRepresentations:
64b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      UNREACHABLE();
65b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return NULL;
66b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
67e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  UNREACHABLE();
68e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return NULL;
69b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
70b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
71b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
72b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t ConvertAndSetOverflow(int64_t result, bool* overflow) {
73b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (result > kMaxInt) {
74b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    *overflow = true;
75b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kMaxInt;
76b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
77b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (result < kMinInt) {
78b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    *overflow = true;
79b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return kMinInt;
80b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
81b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return static_cast<int32_t>(result);
82b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
83b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
84b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
85b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t AddWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
86b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int64_t result = static_cast<int64_t>(a) + static_cast<int64_t>(b);
87b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return ConvertAndSetOverflow(result, overflow);
88b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
89b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
90b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
91b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t SubWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
92b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int64_t result = static_cast<int64_t>(a) - static_cast<int64_t>(b);
93b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return ConvertAndSetOverflow(result, overflow);
94b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
95b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
96b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
97b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochstatic int32_t MulWithoutOverflow(int32_t a, int32_t b, bool* overflow) {
98b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int64_t result = static_cast<int64_t>(a) * static_cast<int64_t>(b);
99b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return ConvertAndSetOverflow(result, overflow);
100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochint32_t Range::Mask() const {
104b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (lower_ == upper_) return lower_;
105b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (lower_ >= 0) {
106b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int32_t res = 1;
107b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    while (res < upper_) {
108b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      res = (res << 1) | 1;
109b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
110b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
111b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
112b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return 0xffffffff;
113b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::AddConstant(int32_t value) {
117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (value == 0) return;
118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;  // Overflow is ignored here.
119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = AddWithoutOverflow(lower_, value, &may_overflow);
120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = AddWithoutOverflow(upper_, value, &may_overflow);
121b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
122b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
123b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
124b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
125e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Intersect(Range* other) {
126e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = Min(upper_, other->upper_);
127e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = Max(lower_, other->lower_);
128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool b = CanBeMinusZero() && other->CanBeMinusZero();
129e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(b);
130e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
131e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
132e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
133e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Union(Range* other) {
134e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = Max(upper_, other->upper_);
135e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = Min(lower_, other->lower_);
136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  bool b = CanBeMinusZero() || other->CanBeMinusZero();
137e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(b);
138e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
139e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
140e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
141e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Sar(int32_t value) {
142e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t bits = value & 0x1F;
143e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = lower_ >> bits;
144e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = upper_ >> bits;
145e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(false);
146e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
147e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
149e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid Range::Shl(int32_t value) {
150e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t bits = value & 0x1F;
151e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int old_lower = lower_;
152e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int old_upper = upper_;
153e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  lower_ = lower_ << bits;
154e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  upper_ = upper_ << bits;
155e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) {
156e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    upper_ = kMaxInt;
157e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    lower_ = kMinInt;
158e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
159e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  set_can_be_minus_zero(false);
160e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
161e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
162e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
163b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::AddAndCheckOverflow(Range* other) {
164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;
165b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = AddWithoutOverflow(lower_, other->lower(), &may_overflow);
166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = AddWithoutOverflow(upper_, other->upper(), &may_overflow);
167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  KeepOrder();
168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return may_overflow;
170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
171b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::SubAndCheckOverflow(Range* other) {
174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;
175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = SubWithoutOverflow(lower_, other->upper(), &may_overflow);
176b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = SubWithoutOverflow(upper_, other->lower(), &may_overflow);
177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  KeepOrder();
178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return may_overflow;
180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
182b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
183b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::KeepOrder() {
184b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (lower_ > upper_) {
185b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    int32_t tmp = lower_;
186b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    lower_ = upper_;
187b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    upper_ = tmp;
188b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
189b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
190b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
191b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
192b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid Range::Verify() const {
193b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(lower_ <= upper_);
194b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
195b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
196b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
197b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool Range::MulAndCheckOverflow(Range* other) {
198b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool may_overflow = false;
199b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v1 = MulWithoutOverflow(lower_, other->lower(), &may_overflow);
200b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v2 = MulWithoutOverflow(lower_, other->upper(), &may_overflow);
201b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v3 = MulWithoutOverflow(upper_, other->lower(), &may_overflow);
202b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int v4 = MulWithoutOverflow(upper_, other->upper(), &may_overflow);
203b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  lower_ = Min(Min(v1, v2), Min(v3, v4));
204b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  upper_ = Max(Max(v1, v2), Max(v3, v4));
205b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Verify();
206b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return may_overflow;
207b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
208b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
209b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
210b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HType::ToString() {
211b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (type_) {
212b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTagged: return "tagged";
213b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTaggedPrimitive: return "primitive";
214b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTaggedNumber: return "number";
215b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kSmi: return "smi";
216b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kHeapNumber: return "heap-number";
217b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kString: return "string";
218b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kBoolean: return "boolean";
219b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kNonPrimitive: return "non-primitive";
220b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kJSArray: return "array";
221b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kJSObject: return "object";
222b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kUninitialized: return "uninitialized";
223b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
224b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UNREACHABLE();
225b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return "Unreachable code";
226b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
227b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
228b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
229b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HType::ToShortString() {
230b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (type_) {
231b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTagged: return "t";
232b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTaggedPrimitive: return "p";
233b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kTaggedNumber: return "n";
234b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kSmi: return "m";
235b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kHeapNumber: return "h";
236b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kString: return "s";
237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kBoolean: return "b";
238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kNonPrimitive: return "r";
239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kJSArray: return "a";
240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kJSObject: return "o";
241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kUninitialized: return "z";
242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  UNREACHABLE();
244b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return "Unreachable code";
245b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
246b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
247b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
248b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHType HType::TypeFromValue(Handle<Object> value) {
249b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType result = HType::Tagged();
250b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (value->IsSmi()) {
251b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::Smi();
252b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsHeapNumber()) {
253b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::HeapNumber();
254b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsString()) {
255b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::String();
256b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsBoolean()) {
257b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::Boolean();
258b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsJSObject()) {
259b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::JSObject();
260b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (value->IsJSArray()) {
261b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = HType::JSArray();
262b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
263b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
264b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
267e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochint HValue::LookupOperandIndex(int occurrence_index, HValue* op) {
268b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
269b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (OperandAt(i) == op) {
270b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (occurrence_index == 0) return i;
271b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      --occurrence_index;
272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return -1;
275b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
276b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
277b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
278b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HValue::IsDefinedAfter(HBasicBlock* other) const {
279b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return block()->block_id() > other->block_id();
280b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
281b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
282b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
283e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool HValue::UsesMultipleTimes(HValue* op) {
284b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool seen = false;
285b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
286b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (OperandAt(i) == op) {
287b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (seen) return true;
288b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      seen = true;
289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return false;
292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
295e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochbool HValue::Equals(HValue* other) {
296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (other->opcode() != opcode()) return false;
297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!other->representation().Equals(representation())) return false;
298b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!other->type_.Equals(type_)) return false;
2991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (other->flags() != flags()) return false;
300b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (OperandCount() != other->OperandCount()) return false;
301b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
302b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (OperandAt(i)->id() != other->OperandAt(i)->id()) return false;
303b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
304b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool result = DataEquals(other);
305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!result || Hashcode() == other->Hashcode());
306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
310e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochintptr_t HValue::Hashcode() {
311b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  intptr_t result = opcode();
312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int count = OperandCount();
313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < count; ++i) {
314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = result * 19 + OperandAt(i)->id() + (result >> 7);
315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
320b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::SetOperandAt(int index, HValue* value) {
321b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(value == NULL || !value->representation().IsNone());
322b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  RegisterUse(index, value);
323b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  InternalSetOperandAt(index, value);
324b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
325b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
326b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
327b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceAndDelete(HValue* other) {
328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (other != NULL) ReplaceValue(other);
329b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  Delete();
330b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
331b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
332b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
333b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceValue(HValue* other) {
334b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < uses_.length(); ++i) {
335e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    HValue* use = uses_[i];
336e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(!use->block()->IsStartBlock());
337e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    InternalReplaceAtUse(use, other);
338e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    other->uses_.Add(use);
339b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
340e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  uses_.Rewind(0);
341b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
342b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
343b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
344b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ClearOperands() {
345b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
346b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetOperandAt(i, NULL);
347b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
348b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
349b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
350b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
351b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::Delete() {
352b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
353b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ClearOperands();
354b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  DeleteFromGraph();
355b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
356b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
357b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
358b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceAtUse(HValue* use, HValue* other) {
359b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < use->OperandCount(); ++i) {
360b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (use->OperandAt(i) == this) {
361b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      use->SetOperandAt(i, other);
362b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
363b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
364b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
365b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
366b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ReplaceFirstAtUse(HValue* use, HValue* other, Representation r) {
368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < use->OperandCount(); ++i) {
369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (use->RequiredInputRepresentation(i).Equals(r) &&
370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        use->OperandAt(i) == this) {
371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      use->SetOperandAt(i, other);
372b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return;
373b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
374b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
375b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
376b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
377b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::InternalReplaceAtUse(HValue* use, HValue* other) {
379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < use->OperandCount(); ++i) {
380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (use->OperandAt(i) == this) {
381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // Call internal method that does not update use lists. The caller is
382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      // responsible for doing so.
383b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      use->InternalSetOperandAt(i, other);
384b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
385b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
386b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
387b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
388b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
389b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::SetBlock(HBasicBlock* block) {
390b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(block_ == NULL || block == NULL);
391b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  block_ = block;
392b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (id_ == kNoNumber && block != NULL) {
393b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    id_ = block->graph()->GetNextValueID(this);
394b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
395b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
396b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
397b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
398b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::PrintTypeTo(HType type, StringStream* stream) {
399b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(type.ToShortString());
400b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
401b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::PrintNameTo(StringStream* stream) {
404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s%d", representation_.Mnemonic(), id());
405b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HValue::UpdateInferredType() {
409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType type = CalculateInferredType();
410b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  bool result = (!type.Equals(type_));
411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  type_ = type;
412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
415b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RegisterUse(int index, HValue* new_value) {
417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue* old_value = OperandAt(index);
418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (old_value == new_value) return;
41944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (old_value != NULL) old_value->uses_.RemoveElement(this);
420b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (new_value != NULL) {
421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    new_value->uses_.Add(this);
422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
426b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::AddNewRange(Range* r) {
427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!HasRange()) ComputeInitialRange();
428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!HasRange()) range_ = new Range();
429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasRange());
430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  r->StackUpon(range_);
431b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  range_ = r;
432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::RemoveLastAddedRange() {
436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasRange());
437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(range_->next() != NULL);
438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  range_ = range_->next();
439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
441b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
442b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HValue::ComputeInitialRange() {
443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!HasRange());
444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  range_ = InferRange();
445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasRange());
446b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
449e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstruction::PrintTo(StringStream* stream) {
450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s", Mnemonic());
451b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (HasSideEffects()) stream->Add("*");
452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" ");
453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  PrintDataTo(stream);
454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
455e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (range() != NULL &&
456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      !range()->IsMostGeneric() &&
457e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      !range()->CanBeMinusZero()) {
458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" range[%d,%d,m0=%d]",
459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                range()->lower(),
460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                range()->upper(),
461b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                static_cast<int>(range()->CanBeMinusZero()));
462b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
463b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
464b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int changes_flags = (flags() & HValue::ChangesFlagsMask());
465b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (changes_flags != 0) {
466b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" changes[0x%x]", changes_flags);
467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsTagged() && !type().Equals(HType::Tagged())) {
470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" type[%s]", type().ToString());
471b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::Unlink() {
476b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(IsLinked());
477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsControlInstruction());  // Must never move control instructions.
478e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(!IsBlockEntry());  // Doesn't make sense to delete these.
479e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(previous_ != NULL);
480e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  previous_->next_ = next_;
481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  if (next_ == NULL) {
482e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    ASSERT(block()->last() == this);
483e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    block()->set_last(previous_);
484e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  } else {
485e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    next_->previous_ = previous_;
486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  }
487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  clear_block();
488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
491b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertBefore(HInstruction* next) {
492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsLinked());
493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!next->IsBlockEntry());
494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsControlInstruction());
495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!next->block()->IsStartBlock());
496b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(next->previous_ != NULL);
497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* prev = next->previous();
498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  prev->next_ = this;
499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  next->previous_ = this;
500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  next_ = next;
501b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  previous_ = prev;
502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetBlock(next->block());
503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
506b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HInstruction::InsertAfter(HInstruction* previous) {
507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsLinked());
508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!previous->IsControlInstruction());
509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!IsControlInstruction() || previous->next_ == NULL);
510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* block = previous->block();
511b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Never insert anything except constants into the start block after finishing
512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // it.
513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (block->IsStartBlock() && block->IsFinished() && !IsConstant()) {
514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(block->end()->SecondSuccessor() == NULL);
515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    InsertAfter(block->end()->FirstSuccessor()->first());
516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return;
517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // If we're inserting after an instruction with side-effects that is
520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // followed by a simulate instruction, we need to insert after the
521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // simulate instruction instead.
522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction* next = previous->next_;
523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (previous->HasSideEffects() && next != NULL) {
524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(next->IsSimulate());
525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    previous = next;
526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    next = previous->next_;
527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  previous_ = previous;
530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  next_ = next;
531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetBlock(block);
532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  previous->next_ = this;
533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (next != NULL) next->previous_ = this;
534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
5381e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HInstruction::Verify() {
539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that input operands are defined before use.
540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBasicBlock* cur_block = block();
541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* other_operand = OperandAt(i);
543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HBasicBlock* other_block = other_operand->block();
544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (cur_block == other_block) {
545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (!other_operand->IsPhi()) {
546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        HInstruction* cur = cur_block->first();
547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        while (cur != NULL) {
548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          ASSERT(cur != this);  // We should reach other_operand before!
549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          if (cur == other_operand) break;
550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch          cur = cur->next();
551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        }
552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        // Must reach other operand in the same block!
553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        ASSERT(cur == other_operand);
554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ASSERT(other_block->Dominates(cur_block));
557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Verify that instructions that may have side-effects are followed
561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // by a simulate instruction.
562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (HasSideEffects() && !IsOsrEntry()) {
563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(next()->IsSimulate());
564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
5651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // Verify that instructions that can be eliminated by GVN have overridden
5671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // HValue::DataEquals.  The default implementation is UNREACHABLE.  We
5681e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  // don't actually care whether DataEquals returns true or false here.
5691e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (CheckFlag(kUseGVN)) DataEquals(this);
570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
574e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryCall::PrintDataTo(StringStream* stream) {
5751e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  value()->PrintNameTo(stream);
5761e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
577e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
5781e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
5791e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5801e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
581e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryCall::PrintDataTo(StringStream* stream) {
5821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  first()->PrintNameTo(stream);
5831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
5841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  second()->PrintNameTo(stream);
5851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
586e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
5871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
5881e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
5891e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
590e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallConstantFunction::PrintDataTo(StringStream* stream) {
5911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (IsApplyFunction()) {
5921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    stream->Add("optimized apply ");
5931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  } else {
5941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    stream->Add("%o ", function()->shared()->DebugName());
595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
596e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
599b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
600e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallNamed::PrintDataTo(StringStream* stream) {
6011e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%o ", *name());
6021e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall::PrintDataTo(stream);
603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
606e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallGlobal::PrintDataTo(StringStream* stream) {
6071e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%o ", *name());
6081e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall::PrintDataTo(stream);
609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
611b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
612e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallKnownGlobal::PrintDataTo(StringStream* stream) {
6131e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("o ", target()->shared()->DebugName());
614e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
617b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
618e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallRuntime::PrintDataTo(StringStream* stream) {
6191e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%o ", *name());
620e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("#%d", argument_count());
621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
622b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
624e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HClassOfTest::PrintDataTo(StringStream* stream) {
6251e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("class_of_test(");
626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
6271e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(", \"%o\")", *class_name());
628b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
631e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HAccessArgumentsAt::PrintDataTo(StringStream* stream) {
6321e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  arguments()->PrintNameTo(stream);
6331e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[");
6341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  index()->PrintNameTo(stream);
6351e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("], length ");
6361e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  length()->PrintNameTo(stream);
637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
640e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HControlInstruction::PrintDataTo(StringStream* stream) {
6411e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  if (FirstSuccessor() != NULL) {
6421e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    int first_id = FirstSuccessor()->block_id();
6431e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    if (SecondSuccessor() == NULL) {
6441e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      stream->Add(" B%d", first_id);
6451e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    } else {
6461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      int second_id = SecondSuccessor()->block_id();
6471e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block      stream->Add(" goto (B%d, B%d)", first_id, second_id);
6481e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    }
6491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  }
650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
652b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
653e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryControlInstruction::PrintDataTo(StringStream* stream) {
654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
6551e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HControlInstruction::PrintDataTo(stream);
656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
659e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCompareMap::PrintDataTo(StringStream* stream) {
660b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
6611e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" (%p)", *map());
6621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HControlInstruction::PrintDataTo(stream);
663b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
664b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
665b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
666b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochconst char* HUnaryMathOperation::OpName() const {
667b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (op()) {
668b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathFloor: return "floor";
669b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathRound: return "round";
670b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathCeil: return "ceil";
671b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathAbs: return "abs";
672b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathLog: return "log";
673b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathSin: return "sin";
674b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathCos: return "cos";
675b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathTan: return "tan";
676b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathASin: return "asin";
677b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathACos: return "acos";
678b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathATan: return "atan";
679b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathExp: return "exp";
680b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case kMathSqrt: return "sqrt";
681b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    default: break;
682b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
683b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return "(unknown operation)";
684b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
685b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
686b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
687e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryMathOperation::PrintDataTo(StringStream* stream) {
688b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  const char* name = OpName();
689b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s ", name);
690b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
691b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
692b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
693b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
694e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HUnaryOperation::PrintDataTo(StringStream* stream) {
695b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
696b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
697b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
698b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
699e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HHasInstanceType::PrintDataTo(StringStream* stream) {
700b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
701b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  switch (from_) {
702b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case FIRST_JS_OBJECT_TYPE:
703b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == LAST_TYPE) stream->Add(" spec_object");
704b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
705b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case JS_REGEXP_TYPE:
706b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == JS_REGEXP_TYPE) stream->Add(" reg_exp");
707b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
708b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case JS_ARRAY_TYPE:
709b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == JS_ARRAY_TYPE) stream->Add(" array");
710b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
711b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    case JS_FUNCTION_TYPE:
712b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (to_ == JS_FUNCTION_TYPE) stream->Add(" function");
713b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
714b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    default:
715b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      break;
716b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
717b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
718b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
719b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
720e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HTypeofIs::PrintDataTo(StringStream* stream) {
721b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
722b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" == ");
723b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(type_literal_->ToAsciiVector());
724b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
725b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
726b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
727e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HChange::PrintDataTo(StringStream* stream) {
728b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HUnaryOperation::PrintDataTo(stream);
7298b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  stream->Add(" %s to %s", from_.Mnemonic(), to().Mnemonic());
730b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
731b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CanTruncateToInt32()) stream->Add(" truncating-int32");
732b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?");
733b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
734b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
735b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
736b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHCheckInstanceType* HCheckInstanceType::NewIsJSObjectOrJSFunction(
737b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* value)  {
738b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  STATIC_ASSERT((LAST_JS_OBJECT_TYPE + 1) == JS_FUNCTION_TYPE);
739b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return new HCheckInstanceType(value, FIRST_JS_OBJECT_TYPE, JS_FUNCTION_TYPE);
740b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
741b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
742b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
743e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckMap::PrintDataTo(StringStream* stream) {
744b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
745b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" %p", *map());
746b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
747b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
748b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
749e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCheckFunction::PrintDataTo(StringStream* stream) {
750b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
751b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" %p", *target());
752b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
753b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
754b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
755e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCallStub::PrintDataTo(StringStream* stream) {
7561e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("%s ",
7571e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block              CodeStub::MajorName(major_key_, false));
7581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  HUnaryCall::PrintDataTo(stream);
759b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
760b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
761b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
762e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HInstanceOf::PrintDataTo(StringStream* stream) {
7631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  left()->PrintNameTo(stream);
7641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
7651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  right()->PrintNameTo(stream);
7661e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add(" ");
7671e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  context()->PrintNameTo(stream);
768b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
769b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
770b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
771b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HValue::InferRange() {
772b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsTagged()) {
773b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // Tagged values are always in int32 range when converted to integer,
774b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    // but they can contain -0.
775b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* result = new Range();
776b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result->set_can_be_minus_zero(true);
777b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
778b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else if (representation().IsNone()) {
779b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return NULL;
780b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
781e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // Untagged integer32 cannot be -0 and we don't compute ranges for
782e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    // untagged doubles.
783b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return new Range();
784b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
785b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
786b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
787b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
788b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HConstant::InferRange() {
789b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (has_int32_value_) {
790b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* result = new Range(int32_value_, int32_value_);
791b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result->set_can_be_minus_zero(false);
792b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
793b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
794e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return HValue::InferRange();
795b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
796b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
797b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
798b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HPhi::InferRange() {
799b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
800b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (block()->IsLoopHeader()) {
801b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      Range* range = new Range(kMinInt, kMaxInt);
802b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return range;
803b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    } else {
804b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      Range* range = OperandAt(0)->range()->Copy();
805b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      for (int i = 1; i < OperandCount(); ++i) {
806b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        range->Union(OperandAt(i)->range());
807b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
808b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return range;
809b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
810b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
811b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return HValue::InferRange();
812b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
813b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
814b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
815b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
816b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HAdd::InferRange() {
817b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
818b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
819b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* b = right()->range();
820b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* res = a->Copy();
821b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!res->AddAndCheckOverflow(b)) {
822b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(kCanOverflow);
823b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
824b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool m0 = a->CanBeMinusZero() && b->CanBeMinusZero();
825b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    res->set_can_be_minus_zero(m0);
826b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
827b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
828e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return HValue::InferRange();
829b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
830b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
831b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
832b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
833b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HSub::InferRange() {
834b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
835b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
836b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* b = right()->range();
837b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* res = a->Copy();
838b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!res->SubAndCheckOverflow(b)) {
839b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(kCanOverflow);
840b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
841b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    res->set_can_be_minus_zero(a->CanBeMinusZero() && b->CanBeZero());
842b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
843b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
844e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return HValue::InferRange();
845b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
846b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
847b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
848b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
849b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HMul::InferRange() {
850b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
851b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
852b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* b = right()->range();
853b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* res = a->Copy();
854b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!res->MulAndCheckOverflow(b)) {
855b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(kCanOverflow);
856b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
857b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    bool m0 = (a->CanBeZero() && b->CanBeNegative()) ||
858b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        (a->CanBeNegative() && b->CanBeZero());
859b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    res->set_can_be_minus_zero(m0);
860b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return res;
861b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
862e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return HValue::InferRange();
863b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
864b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
865b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
866b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
867b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HDiv::InferRange() {
868b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
869b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* result = new Range();
870b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->range()->CanBeMinusZero()) {
871b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->set_can_be_minus_zero(true);
872b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
873b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
874b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (left()->range()->CanBeZero() && right()->range()->CanBeNegative()) {
875b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->set_can_be_minus_zero(true);
876b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
877b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
878b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (right()->range()->Includes(-1) && left()->range()->Includes(kMinInt)) {
879b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(HValue::kCanOverflow);
880b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
881b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
882b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!right()->range()->CanBeZero()) {
883b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(HValue::kCanBeDivByZero);
884b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
885b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
886b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
887e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return HValue::InferRange();
888b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
889b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
890b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
891b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
892b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HMod::InferRange() {
893b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32()) {
894b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* a = left()->range();
895b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    Range* result = new Range();
896b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (a->CanBeMinusZero() || a->CanBeNegative()) {
897b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      result->set_can_be_minus_zero(true);
898b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
899b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!right()->range()->CanBeZero()) {
900b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      ClearFlag(HValue::kCanBeDivByZero);
901b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
902b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return result;
903b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
904e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch    return HValue::InferRange();
905b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
906b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
907b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
908b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
909e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HPhi::PrintTo(StringStream* stream) {
910b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[");
911b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
912b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* value = OperandAt(i);
913b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" ");
914b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    value->PrintNameTo(stream);
915b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" ");
916b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
917b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" uses%d_%di_%dd_%dt]",
918b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              uses()->length(),
919b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              int32_non_phi_uses() + int32_indirect_uses(),
920b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              double_non_phi_uses() + double_indirect_uses(),
921b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch              tagged_non_phi_uses() + tagged_indirect_uses());
922b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
923b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
924b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
925b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddInput(HValue* value) {
926b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  inputs_.Add(NULL);
927b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetOperandAt(OperandCount() - 1, value);
928b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Mark phis that may have 'arguments' directly or indirectly as an operand.
929b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) {
930b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kIsArguments);
931b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
932b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
933b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
934b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
93544f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HPhi::HasRealUses() {
93644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0; i < uses()->length(); i++) {
93744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (!uses()->at(i)->IsPhi()) return true;
93844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
93944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return false;
94044f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
94144f0eee88ff00398ff7f715fab053374d808c90dSteve Block
94244f0eee88ff00398ff7f715fab053374d808c90dSteve Block
943e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHValue* HPhi::GetRedundantReplacement() {
944b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HValue* candidate = NULL;
945b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int count = OperandCount();
946b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int position = 0;
947b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  while (position < count && candidate == NULL) {
948b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* current = OperandAt(position++);
949b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (current != this) candidate = current;
950b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
951b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  while (position < count) {
952b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* current = OperandAt(position++);
953b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (current != this && current != candidate) return NULL;
954b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
955b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(candidate != this);
956b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return candidate;
957b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
958b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
959b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
960b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::DeleteFromGraph() {
961b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(block() != NULL);
962b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  block()->RemovePhi(this);
963b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(block() == NULL);
964b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
965b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
966b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
967b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::InitRealUses(int phi_id) {
968b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Initialize real uses.
969b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  phi_id_ = phi_id;
970b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int j = 0; j < uses()->length(); j++) {
971b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* use = uses()->at(j);
972b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (!use->IsPhi()) {
973b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      int index = use->LookupOperandIndex(0, this);
974b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      Representation req_rep = use->RequiredInputRepresentation(index);
975b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      non_phi_uses_[req_rep.kind()]++;
976b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
977b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
978b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
979b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
980b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
981b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddNonPhiUsesFrom(HPhi* other) {
982b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < Representation::kNumRepresentations; i++) {
983b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    indirect_uses_[i] += other->non_phi_uses_[i];
984b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
985b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
986b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
987b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
988b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HPhi::AddIndirectUsesTo(int* dest) {
989b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < Representation::kNumRepresentations; i++) {
990b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    dest[i] += indirect_uses_[i];
991b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
992b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
993b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
994b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
995e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HSimulate::PrintDataTo(StringStream* stream) {
996b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("id=%d ", ast_id());
997b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (pop_count_ > 0) stream->Add("pop %d", pop_count_);
998b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (values_.length() > 0) {
999b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (pop_count_ > 0) stream->Add(" /");
1000b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    for (int i = 0; i < values_.length(); ++i) {
1001b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      if (!HasAssignedIndexAt(i)) {
1002b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        stream->Add(" push ");
1003b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      } else {
1004b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch        stream->Add(" var[%d] = ", GetAssignedIndexAt(i));
1005b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      }
1006b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      values_[i]->PrintNameTo(stream);
1007b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1008b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1009b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1010b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1011b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1012e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HEnterInlined::PrintDataTo(StringStream* stream) {
1013b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SmartPointer<char> name = function()->debug_name()->ToCString();
1014b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%s, id=%d", *name, function()->id());
1015b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1016b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1017b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1018b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant::HConstant(Handle<Object> handle, Representation r)
1019b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    : handle_(handle),
1020053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block      constant_type_(HType::TypeFromValue(handle)),
1021b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      has_int32_value_(false),
10228b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      int32_value_(0),
1023053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block      has_double_value_(false),
1024b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      double_value_(0)  {
1025b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  set_representation(r);
1026b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  SetFlag(kUseGVN);
1027b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (handle_->IsNumber()) {
1028b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    double n = handle_->Number();
1029b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    double roundtrip_value = static_cast<double>(static_cast<int32_t>(n));
1030b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch    has_int32_value_ = BitCast<int64_t>(roundtrip_value) == BitCast<int64_t>(n);
1031b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (has_int32_value_) int32_value_ = static_cast<int32_t>(n);
1032b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    double_value_ = n;
1033b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    has_double_value_ = true;
1034b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1035b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1036b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1037b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1038b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToRepresentation(Representation r) const {
1039b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (r.IsInteger32() && !has_int32_value_) return NULL;
1040b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (r.IsDouble() && !has_double_value_) return NULL;
1041b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return new HConstant(handle_, r);
1042b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1043b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1044b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1045b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHConstant* HConstant::CopyToTruncatedInt32() const {
1046b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!has_double_value_) return NULL;
1047b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  int32_t truncated = NumberToInt32(*handle_);
104844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return new HConstant(FACTORY->NewNumberFromInt(truncated),
1049b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch                       Representation::Integer32());
1050b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1051b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1052b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
10538b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochbool HConstant::ToBoolean() const {
10548b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // Converts the constant's boolean value according to
10558b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  // ECMAScript section 9.2 ToBoolean conversion.
10568b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (HasInteger32Value()) return Integer32Value() != 0;
10578b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (HasDoubleValue()) {
10588b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    double v = DoubleValue();
10598b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch    return v != 0 && !isnan(v);
10608b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  }
10618b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsTrue()) return true;
10628b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsFalse()) return false;
10638b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsUndefined()) return false;
10648b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsNull()) return false;
10658b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  if (handle()->IsString() &&
10668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch      String::cast(*handle())->length() == 0) return false;
10678b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  return true;
10688b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
10698b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1070e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HConstant::PrintDataTo(StringStream* stream) {
1071b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  handle()->ShortPrint(stream);
1072b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1073b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1074b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1075b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochbool HArrayLiteral::IsCopyOnWrite() const {
107644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return constant_elements()->map() == HEAP->fixed_cow_array_map();
1077b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1078b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1079b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1080e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HBinaryOperation::PrintDataTo(StringStream* stream) {
1081b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  left()->PrintNameTo(stream);
1082b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" ");
1083b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  right()->PrintNameTo(stream);
1084b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CheckFlag(kCanOverflow)) stream->Add(" !");
1085b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CheckFlag(kBailoutOnMinusZero)) stream->Add(" -0?");
1086b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1087b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1088b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1089b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HBitAnd::InferRange() {
1090e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t left_mask = (left()->range() != NULL)
1091e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? left()->range()->Mask()
1092e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : 0xffffffff;
1093e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t right_mask = (right()->range() != NULL)
1094e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? right()->range()->Mask()
1095e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : 0xffffffff;
1096e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t result_mask = left_mask & right_mask;
1097e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return (result_mask >= 0)
1098e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? new Range(0, result_mask)
1099e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HValue::InferRange();
1100b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1101b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1102b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1103b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HBitOr::InferRange() {
1104e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t left_mask = (left()->range() != NULL)
1105e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? left()->range()->Mask()
1106e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : 0xffffffff;
1107e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t right_mask = (right()->range() != NULL)
1108e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? right()->range()->Mask()
1109e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : 0xffffffff;
1110e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  int32_t result_mask = left_mask | right_mask;
1111e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return (result_mask >= 0)
1112e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      ? new Range(0, result_mask)
1113e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      : HValue::InferRange();
1114b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1115b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1116b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1117b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HSar::InferRange() {
1118b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (right()->IsConstant()) {
1119b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* c = HConstant::cast(right());
1120b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (c->HasInteger32Value()) {
1121e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      Range* result = (left()->range() != NULL)
1122e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          ? left()->range()->Copy()
1123e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          : new Range();
1124e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result->Sar(c->Integer32Value());
1125b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return result;
1126b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1127b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1128e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return HValue::InferRange();
1129b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1130b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1131b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1132b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochRange* HShl::InferRange() {
1133b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (right()->IsConstant()) {
1134b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HConstant* c = HConstant::cast(right());
1135b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (c->HasInteger32Value()) {
1136e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      Range* result = (left()->range() != NULL)
1137e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          ? left()->range()->Copy()
1138e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch          : new Range();
1139e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch      result->Shl(c->Integer32Value());
1140b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      return result;
1141b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1142b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1143e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  return HValue::InferRange();
1144b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1145b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1146b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1147b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1148e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HCompare::PrintDataTo(StringStream* stream) {
1149b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(Token::Name(token()));
1150b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" ");
1151b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HBinaryOperation::PrintDataTo(stream);
1152b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1153b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1154b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1155b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdochvoid HCompare::SetInputRepresentation(Representation r) {
1156b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  input_representation_ = r;
1157b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (r.IsTagged()) {
11581e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    SetAllSideEffects();
1159b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ClearFlag(kUseGVN);
11607d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch  } else if (r.IsDouble()) {
11617d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    SetFlag(kDeoptimizeOnUndefined);
11627d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    ClearAllSideEffects();
11637d3e7fc4b65010eabe860313ee0c64f50843f6e3Ben Murdoch    SetFlag(kUseGVN);
1164b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  } else {
11651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block    ClearAllSideEffects();
1166b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kUseGVN);
1167b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1168b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1169b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1170b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1171e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HParameter::PrintDataTo(StringStream* stream) {
1172b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("%u", index());
1173b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1174b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1175b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1176e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadNamedField::PrintDataTo(StringStream* stream) {
1177b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1178b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : "");
1179b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1180b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1181b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
118244f0eee88ff00398ff7f715fab053374d808c90dSteve BlockHLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* object,
118344f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                                       ZoneMapList* types,
118444f0eee88ff00398ff7f715fab053374d808c90dSteve Block                                                       Handle<String> name)
118544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    : HUnaryOperation(object),
118644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      types_(Min(types->length(), kMaxLoadPolymorphism)),
118744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      name_(name),
118844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      need_generic_(false) {
118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  set_representation(Representation::Tagged());
119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  SetFlag(kDependsOnMaps);
119144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0;
119244f0eee88ff00398ff7f715fab053374d808c90dSteve Block       i < types->length() && types_.length() < kMaxLoadPolymorphism;
119344f0eee88ff00398ff7f715fab053374d808c90dSteve Block       ++i) {
119444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    Handle<Map> map = types->at(i);
119544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    LookupResult lookup;
119644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    map->LookupInDescriptors(NULL, *name, &lookup);
119744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (lookup.IsProperty() && lookup.type() == FIELD) {
119844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      types_.Add(types->at(i));
119944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      int index = lookup.GetLocalFieldIndexFromMap(*map);
120044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      if (index < 0) {
120144f0eee88ff00398ff7f715fab053374d808c90dSteve Block        SetFlag(kDependsOnInobjectFields);
120244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      } else {
120344f0eee88ff00398ff7f715fab053374d808c90dSteve Block        SetFlag(kDependsOnBackingStoreFields);
120444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
120544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
120644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
120744f0eee88ff00398ff7f715fab053374d808c90dSteve Block
120844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (types_.length() == types->length() && FLAG_deoptimize_uncommon_cases) {
120944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetFlag(kUseGVN);
121044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  } else {
121144f0eee88ff00398ff7f715fab053374d808c90dSteve Block    SetAllSideEffects();
121244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    need_generic_ = true;
121344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
121444f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
121544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
121644f0eee88ff00398ff7f715fab053374d808c90dSteve Block
121744f0eee88ff00398ff7f715fab053374d808c90dSteve Blockbool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) {
121844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value);
121944f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (types_.length() != other->types()->length()) return false;
122044f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (!name_.is_identical_to(other->name())) return false;
122144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  if (need_generic_ != other->need_generic_) return false;
122244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  for (int i = 0; i < types_.length(); i++) {
122344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    bool found = false;
122444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    for (int j = 0; j < types_.length(); j++) {
122544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      if (types_.at(j).is_identical_to(other->types()->at(i))) {
122644f0eee88ff00398ff7f715fab053374d808c90dSteve Block        found = true;
122744f0eee88ff00398ff7f715fab053374d808c90dSteve Block        break;
122844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      }
122944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    }
123044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    if (!found) return false;
123144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
123244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  return true;
123344f0eee88ff00398ff7f715fab053374d808c90dSteve Block}
123444f0eee88ff00398ff7f715fab053374d808c90dSteve Block
123544f0eee88ff00398ff7f715fab053374d808c90dSteve Block
1236e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
1237b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1238b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[");
1239b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  key()->PrintNameTo(stream);
1240b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("]");
1241b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1242b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1243b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1244e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadKeyedGeneric::PrintDataTo(StringStream* stream) {
1245e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintNameTo(stream);
1246e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
1247e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintNameTo(stream);
1248e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("]");
1249e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1250e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1251e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
125244f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HLoadKeyedSpecializedArrayElement::PrintDataTo(
125344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StringStream* stream) {
12541e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  external_pointer()->PrintNameTo(stream);
125544f0eee88ff00398ff7f715fab053374d808c90dSteve Block  stream->Add(".");
125644f0eee88ff00398ff7f715fab053374d808c90dSteve Block  switch (array_type()) {
125744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalByteArray:
125844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("byte");
125944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
126044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalUnsignedByteArray:
126144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_byte");
126244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
126344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalShortArray:
126444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("short");
126544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
126644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalUnsignedShortArray:
126744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_short");
126844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
126944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalIntArray:
127044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("int");
127144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
127244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalUnsignedIntArray:
127344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_int");
127444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
127544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalFloatArray:
127644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("float");
127744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
127844f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalPixelArray:
127944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("pixel");
128044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
128144f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
12821e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[");
12831e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  key()->PrintNameTo(stream);
12841e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("]");
12851e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
12861e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
12871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1288e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedGeneric::PrintDataTo(StringStream* stream) {
1289b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1290b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(".");
1291b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(name()->IsString());
1292b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(*String::cast(*name())->ToCString());
1293b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add(" = ");
1294b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
1295b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1296b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1297b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1298e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreNamedField::PrintDataTo(StringStream* stream) {
1299e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintNameTo(stream);
1300e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(".");
1301e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  ASSERT(name()->IsString());
1302e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(*String::cast(*name())->ToCString());
1303e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add(" = ");
1304e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintNameTo(stream);
1305b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (!transition().is_null()) {
1306b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    stream->Add(" (transition map %p)", *transition());
1307b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1308b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1309b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1310b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1311e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
1312b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  object()->PrintNameTo(stream);
1313b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[");
1314b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  key()->PrintNameTo(stream);
1315b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("] = ");
1316b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
1317b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1318b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1319b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1320e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
1321e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  object()->PrintNameTo(stream);
1322e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
1323e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintNameTo(stream);
1324e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("] = ");
1325e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintNameTo(stream);
1326e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1327e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1328e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
132944f0eee88ff00398ff7f715fab053374d808c90dSteve Blockvoid HStoreKeyedSpecializedArrayElement::PrintDataTo(
133044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    StringStream* stream) {
1331e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  external_pointer()->PrintNameTo(stream);
133244f0eee88ff00398ff7f715fab053374d808c90dSteve Block  stream->Add(".");
133344f0eee88ff00398ff7f715fab053374d808c90dSteve Block  switch (array_type()) {
133444f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalByteArray:
133544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("byte");
133644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
133744f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalUnsignedByteArray:
133844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_byte");
133944f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
134044f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalShortArray:
134144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("short");
134244f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
134344f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalUnsignedShortArray:
134444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_short");
134544f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
134644f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalIntArray:
134744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("int");
134844f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
134944f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalUnsignedIntArray:
135044f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("u_int");
135144f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
135244f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalFloatArray:
135344f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("float");
135444f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
135544f0eee88ff00398ff7f715fab053374d808c90dSteve Block    case kExternalPixelArray:
135644f0eee88ff00398ff7f715fab053374d808c90dSteve Block      stream->Add("pixel");
135744f0eee88ff00398ff7f715fab053374d808c90dSteve Block      break;
135844f0eee88ff00398ff7f715fab053374d808c90dSteve Block  }
1359e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("[");
1360e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  key()->PrintNameTo(stream);
1361e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  stream->Add("] = ");
1362e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch  value()->PrintNameTo(stream);
1363e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch}
1364e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
1365e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdoch
13668b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalCell::PrintDataTo(StringStream* stream) {
1367b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[%p]", *cell());
1368b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (check_hole_value()) stream->Add(" (deleteable/read-only)");
1369b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1370b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1371b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13728b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HLoadGlobalGeneric::PrintDataTo(StringStream* stream) {
13738b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  stream->Add("%o ", *name());
13748b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
13758b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
13768b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
13778b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalCell::PrintDataTo(StringStream* stream) {
1378b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  stream->Add("[%p] = ", *cell());
1379b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  value()->PrintNameTo(stream);
1380b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1381b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1382b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
13838b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdochvoid HStoreGlobalGeneric::PrintDataTo(StringStream* stream) {
13848b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  stream->Add("%o = ", *name());
13858b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch  value()->PrintNameTo(stream);
13868b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch}
13878b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
13888b112d2025046f85ef7f6be087c6129c872ebad2Ben Murdoch
1389e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HLoadContextSlot::PrintDataTo(StringStream* stream) {
13901e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  value()->PrintNameTo(stream);
13911e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d]", slot_index());
13921e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
13931e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
13941e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1395e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen Murdochvoid HStoreContextSlot::PrintDataTo(StringStream* stream) {
13961e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  context()->PrintNameTo(stream);
13971e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  stream->Add("[%d] = ", slot_index());
13981e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  value()->PrintNameTo(stream);
1399b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch}
1400b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1401b8e0da25ee8efac3bb05cd6b2730aafbd96119f4Ben Murdoch
1402b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Implementation of type inference and type conversions. Calculates
1403b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// the inferred type of this instruction based on the input operands.
1404b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1405e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HValue::CalculateInferredType() {
1406b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return type_;
1407b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1408b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1409b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1410e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckMap::CalculateInferredType() {
1411b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return value()->type();
1412b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1413b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1414b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1415e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckFunction::CalculateInferredType() {
1416b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return value()->type();
1417b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1418b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1419b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1420e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckNonSmi::CalculateInferredType() {
1421b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // TODO(kasperl): Is there any way to signal that this isn't a smi?
1422b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Tagged();
1423b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1424b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1425b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1426e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCheckSmi::CalculateInferredType() {
1427b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Smi();
1428b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1429b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1430b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1431e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HPhi::CalculateInferredType() {
1432b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HType result = HType::Uninitialized();
1433b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
1434b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HType current = OperandAt(i)->type();
1435b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    result = result.Combine(current);
1436b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1437b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return result;
1438b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1439b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1440b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1441e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HConstant::CalculateInferredType() {
1442053d10c438f14580aaf4ab1b2aad93a5a4fe8b82Steve Block  return constant_type_;
1443b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1444b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1445b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1446e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCompare::CalculateInferredType() {
1447b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Boolean();
1448b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1449b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1450b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1451e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HCompareJSObjectEq::CalculateInferredType() {
1452b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Boolean();
1453b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1454b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1455b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1456e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HUnaryPredicate::CalculateInferredType() {
1457b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Boolean();
1458b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1459b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1460b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1461e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitwiseBinaryOperation::CalculateInferredType() {
14621e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block  return HType::TaggedNumber();
14631e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block}
14641e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
14651e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block
1466e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HArithmeticBinaryOperation::CalculateInferredType() {
1467b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1468b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1469b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1470b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1471e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HAdd::CalculateInferredType() {
1472b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::Tagged();
1473b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1474b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1475b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1476e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitAnd::CalculateInferredType() {
1477b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1478b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1479b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1480b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1481e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitXor::CalculateInferredType() {
1482b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1483b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1484b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1485b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1486e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitOr::CalculateInferredType() {
1487b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1488b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1489b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1490b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1491e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HBitNot::CalculateInferredType() {
1492b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1493b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1494b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1495b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1496e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HUnaryMathOperation::CalculateInferredType() {
1497b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1498b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1499b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1500b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1501e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HShl::CalculateInferredType() {
1502b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1503b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1504b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1505b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1506e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HShr::CalculateInferredType() {
1507b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1508b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1509b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1510b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1511e0cee9b3ed82e2391fd85d118aeaa4ea361c687dBen MurdochHType HSar::CalculateInferredType() {
1512b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return HType::TaggedNumber();
1513b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1514b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1515b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1516b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HUnaryMathOperation::EnsureAndPropagateNotMinusZero(
1517b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    BitVector* visited) {
1518b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1519b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (representation().IsInteger32() &&
1520b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      !value()->representation().IsInteger32()) {
1521b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    if (value()->range() == NULL || value()->range()->CanBeMinusZero()) {
1522b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      SetFlag(kBailoutOnMinusZero);
1523b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    }
1524b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1525b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (RequiredInputRepresentation(0).IsInteger32() &&
1526b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch      representation().IsInteger32()) {
1527b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return value();
1528b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1529b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1530b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1531b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1532b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1533b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1534b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HChange::EnsureAndPropagateNotMinusZero(BitVector* visited) {
1535b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1536b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (from().IsInteger32()) return NULL;
1537b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (CanTruncateToInt32()) return NULL;
1538b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (value()->range() == NULL || value()->range()->CanBeMinusZero()) {
1539b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
1540b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1541b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(!from().IsInteger32() || !to().IsInteger32());
1542b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1543b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1544b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1545b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1546b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMod::EnsureAndPropagateNotMinusZero(BitVector* visited) {
1547b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1548b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
1549b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
1550b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
1551b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1552b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1553b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1554b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1555b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1556b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HDiv::EnsureAndPropagateNotMinusZero(BitVector* visited) {
1557b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1558b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
1559b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
1560b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1561b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1562b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1563b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1564b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1565b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HMul::EnsureAndPropagateNotMinusZero(BitVector* visited) {
1566b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1567b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
1568b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    SetFlag(kBailoutOnMinusZero);
1569b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1570b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1571b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1572b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1573b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1574b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HSub::EnsureAndPropagateNotMinusZero(BitVector* visited) {
1575b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1576b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Propagate to the left argument. If the left argument cannot be -0, then
1577b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the result of the add operation cannot be either.
1578b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
1579b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
1580b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1581b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1582b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1583b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1584b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1585b0fe1620dcb4135ac3ab2d66ff93072373911299Ben MurdochHValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) {
1586b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  visited->Add(id());
1587b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // Propagate to the left argument. If the left argument cannot be -0, then
1588b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  // the result of the sub operation cannot be either.
1589b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  if (range() == NULL || range()->CanBeMinusZero()) {
1590b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    return left();
1591b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1592b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  return NULL;
1593b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1594b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1595b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1596b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch// Node-specific verification code is only included in debug mode.
1597b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#ifdef DEBUG
1598b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
15991e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HPhi::Verify() {
1600b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(OperandCount() == block()->predecessors()->length());
1601b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  for (int i = 0; i < OperandCount(); ++i) {
1602b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HValue* value = OperandAt(i);
1603b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HBasicBlock* defining_block = value->block();
1604b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    HBasicBlock* predecessor_block = block()->predecessors()->at(i);
1605b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch    ASSERT(defining_block == predecessor_block ||
1606b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch           defining_block->Dominates(predecessor_block));
1607b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  }
1608b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1609b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1610b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16111e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HSimulate::Verify() {
1612b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1613b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasAstId());
1614b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1615b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1616b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16171e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HBoundsCheck::Verify() {
1618b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1619b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1620b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1621b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16221e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckSmi::Verify() {
1623b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1624b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
1625b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1626b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1627b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16281e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckNonSmi::Verify() {
1629b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1630b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
1631b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1632b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1633b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16341e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckInstanceType::Verify() {
1635b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1636b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
1637b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1638b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1639b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16401e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckMap::Verify() {
1641b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1642b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
1643b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1644b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1645b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16461e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckFunction::Verify() {
1647b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1648b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
1649b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1650b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1651b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
16521e0659c275bb392c045087af4f6b0d7565cb3d77Steve Blockvoid HCheckPrototypeMaps::Verify() {
1653b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  HInstruction::Verify();
1654b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch  ASSERT(HasNoUses());
1655b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch}
1656b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1657b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch#endif
1658b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch
1659b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} }  // namespace v8::internal
1660