1f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com// Copyright 2012 the V8 project authors. All rights reserved.
23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be
33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file.
4a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
5196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h"
6a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
7e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org#include "src/base/bits.h"
8196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/double.h"
9196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/factory.h"
10196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/hydrogen-infer-representation.h"
11196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/property-details-inl.h"
12a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
13a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#if V8_TARGET_ARCH_IA32
144b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/ia32/lithium-ia32.h"  // NOLINT
15a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#elif V8_TARGET_ARCH_X64
164b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/x64/lithium-x64.h"  // NOLINT
17fa0c3c69b9d632e5730bdd9c745c375beef5e54dmachenbach@chromium.org#elif V8_TARGET_ARCH_ARM64
184b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm64/lithium-arm64.h"  // NOLINT
19a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#elif V8_TARGET_ARCH_ARM
204b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/arm/lithium-arm.h"  // NOLINT
217516f05132429850aa326421ed3e25f23b4c071blrn@chromium.org#elif V8_TARGET_ARCH_MIPS
224b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/mips/lithium-mips.h"  // NOLINT
2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#elif V8_TARGET_ARCH_MIPS64
2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/lithium-mips64.h"  // NOLINT
25864abd7677f434b5aef191e3388e71cd4dd1e6c8machenbach@chromium.org#elif V8_TARGET_ARCH_X87
264b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include "src/x87/lithium-x87.h"  // NOLINT
27a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#else
28a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#error Unsupported target architecture.
29a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif
30a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
31975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org#include "src/base/safe_math.h"
32975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
33a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace v8 {
34a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgnamespace internal {
35a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
36a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#define DEFINE_COMPILE(type)                                         \
37a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  LInstruction* H##type::CompileToLithium(LChunkBuilder* builder) {  \
38a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return builder->Do##type(this);                                  \
39a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
40a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgHYDROGEN_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE)
41a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#undef DEFINE_COMPILE
42a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
43a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4409d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.orgIsolate* HValue::isolate() const {
45e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(block() != NULL);
46750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  return block()->isolate();
4709d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org}
4809d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org
4909d7ab5aba54ebac170eac755664c45eefb0be7dulan@chromium.org
507304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.orgvoid HValue::AssumeRepresentation(Representation r) {
517304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  if (CheckFlag(kFlexibleRepresentation)) {
527304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    ChangeRepresentation(r);
537304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    // The representation of the value is dictated by type feedback and
547304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    // will not be changed later.
557304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org    ClearFlag(kFlexibleRepresentation);
567304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org  }
577304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org}
587304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
597304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org
601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HValue::InferRepresentation(HInferRepresentationPhase* h_infer) {
61e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CheckFlag(kFlexibleRepresentation));
62fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation new_rep = RepresentationFromInputs();
63fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  UpdateRepresentation(new_rep, h_infer, "inputs");
64fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  new_rep = RepresentationFromUses();
65fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  UpdateRepresentation(new_rep, h_infer, "uses");
66fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (representation().IsSmi() && HasNonSmiUse()) {
67fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    UpdateRepresentation(
68fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        Representation::Integer32(), h_infer, "use requirements");
69b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  }
70fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
71fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
72fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
73fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgRepresentation HValue::RepresentationFromUses() {
74fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (HasNoUses()) return Representation::None();
75fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
76fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Array of use counts for each representation.
77fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  int use_count[Representation::kNumRepresentations] = { 0 };
78fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
79fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
80fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    HValue* use = it.value();
81fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    Representation rep = use->observed_input_representation(it.index());
82fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    if (rep.IsNone()) continue;
83fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    if (FLAG_trace_representation) {
84fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      PrintF("#%d %s is used by #%d %s as %s%s\n",
85fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org             id(), Mnemonic(), use->id(), use->Mnemonic(), rep.Mnemonic(),
86fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org             (use->CheckFlag(kTruncatingToInt32) ? "-trunc" : ""));
87fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
88e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org    use_count[rep.kind()] += 1;
89fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
90fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (IsPhi()) HPhi::cast(this)->AddIndirectUsesTo(&use_count[0]);
91fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  int tagged_count = use_count[Representation::kTagged];
92fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  int double_count = use_count[Representation::kDouble];
93fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  int int32_count = use_count[Representation::kInteger32];
94a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  int smi_count = use_count[Representation::kSmi];
95fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
96fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (tagged_count > 0) return Representation::Tagged();
97fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (double_count > 0) return Representation::Double();
98fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (int32_count > 0) return Representation::Integer32();
99a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (smi_count > 0) return Representation::Smi();
100fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
101fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  return Representation::None();
102fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
103fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
104fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
105fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgvoid HValue::UpdateRepresentation(Representation new_rep,
1061510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org                                  HInferRepresentationPhase* h_infer,
107fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org                                  const char* reason) {
108fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation r = representation();
109fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (new_rep.is_more_general_than(r)) {
1101510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (CheckFlag(kCannotBeTagged) && new_rep.IsTagged()) return;
111d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    if (FLAG_trace_representation) {
112d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      PrintF("Changing #%d %s representation %s -> %s based on %s\n",
113d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org             id(), Mnemonic(), r.Mnemonic(), new_rep.Mnemonic(), reason);
114fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
115fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    ChangeRepresentation(new_rep);
116fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    AddDependantsToWorklist(h_infer);
117fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
118fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
119fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
120fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
1211510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HValue::AddDependantsToWorklist(HInferRepresentationPhase* h_infer) {
122fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
123fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    h_infer->AddToWorklist(it.value());
124fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
125fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
126fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    h_infer->AddToWorklist(OperandAt(i));
127fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
128fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
129fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
130fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
131fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgstatic int32_t ConvertAndSetOverflow(Representation r,
132fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                     int64_t result,
133fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                     bool* overflow) {
134fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (r.IsSmi()) {
135fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (result > Smi::kMaxValue) {
136fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      *overflow = true;
137fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return Smi::kMaxValue;
138fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
139fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (result < Smi::kMinValue) {
140fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      *overflow = true;
141fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return Smi::kMinValue;
142fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
143fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
144fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (result > kMaxInt) {
145fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      *overflow = true;
146fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return kMaxInt;
147fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
148fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (result < kMinInt) {
149fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      *overflow = true;
150fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return kMinInt;
151fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
152a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1535f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return static_cast<int32_t>(result);
154a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
155a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
156a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
157fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgstatic int32_t AddWithoutOverflow(Representation r,
158fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  int32_t a,
159fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  int32_t b,
160fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  bool* overflow) {
1615f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  int64_t result = static_cast<int64_t>(a) + static_cast<int64_t>(b);
162fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return ConvertAndSetOverflow(r, result, overflow);
163a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
164a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
165a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
166fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgstatic int32_t SubWithoutOverflow(Representation r,
167fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  int32_t a,
168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  int32_t b,
169fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  bool* overflow) {
1705f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  int64_t result = static_cast<int64_t>(a) - static_cast<int64_t>(b);
171fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return ConvertAndSetOverflow(r, result, overflow);
1725f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org}
173a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
174a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
175fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgstatic int32_t MulWithoutOverflow(const Representation& r,
176fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  int32_t a,
177fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  int32_t b,
178fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  bool* overflow) {
1795f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  int64_t result = static_cast<int64_t>(a) * static_cast<int64_t>(b);
180fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return ConvertAndSetOverflow(r, result, overflow);
181a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
182a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
183a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgint32_t Range::Mask() const {
185a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (lower_ == upper_) return lower_;
186a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (lower_ >= 0) {
187a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    int32_t res = 1;
188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    while (res < upper_) {
189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      res = (res << 1) | 1;
190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
191a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return res;
192a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
193a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return 0xffffffff;
194a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
195a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
196a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1975f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.orgvoid Range::AddConstant(int32_t value) {
198a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (value == 0) return;
1995f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  bool may_overflow = false;  // Overflow is ignored here.
200fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  Representation r = Representation::Integer32();
201fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  lower_ = AddWithoutOverflow(r, lower_, value, &may_overflow);
202fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  upper_ = AddWithoutOverflow(r, upper_, value, &may_overflow);
203c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Verify();
205c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
207a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
208a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2098f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.orgvoid Range::Intersect(Range* other) {
2108f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  upper_ = Min(upper_, other->upper_);
2118f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  lower_ = Max(lower_, other->lower_);
2128f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  bool b = CanBeMinusZero() && other->CanBeMinusZero();
2138f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  set_can_be_minus_zero(b);
2148f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org}
2158f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
2168f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
2178f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.orgvoid Range::Union(Range* other) {
2188f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  upper_ = Max(upper_, other->upper_);
2198f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  lower_ = Min(lower_, other->lower_);
2208f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  bool b = CanBeMinusZero() || other->CanBeMinusZero();
2218f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  set_can_be_minus_zero(b);
2228f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org}
2238f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
2248f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
225471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgvoid Range::CombinedMax(Range* other) {
226471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  upper_ = Max(upper_, other->upper_);
227471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  lower_ = Max(lower_, other->lower_);
228471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  set_can_be_minus_zero(CanBeMinusZero() || other->CanBeMinusZero());
229471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
230471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
231471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
232471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgvoid Range::CombinedMin(Range* other) {
233471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  upper_ = Min(upper_, other->upper_);
234471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  lower_ = Min(lower_, other->lower_);
235471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  set_can_be_minus_zero(CanBeMinusZero() || other->CanBeMinusZero());
236471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
237471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
238471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2398f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.orgvoid Range::Sar(int32_t value) {
2408f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  int32_t bits = value & 0x1F;
2418f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  lower_ = lower_ >> bits;
2428f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  upper_ = upper_ >> bits;
2438f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  set_can_be_minus_zero(false);
2448f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org}
2458f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
2468f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
2478f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.orgvoid Range::Shl(int32_t value) {
2488f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  int32_t bits = value & 0x1F;
2498f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  int old_lower = lower_;
2508f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  int old_upper = upper_;
2518f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  lower_ = lower_ << bits;
2528f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  upper_ = upper_ << bits;
2538f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  if (old_lower != lower_ >> bits || old_upper != upper_ >> bits) {
2548f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    upper_ = kMaxInt;
2558f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org    lower_ = kMinInt;
2568f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  }
2578f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  set_can_be_minus_zero(false);
2588f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org}
2598f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
2608f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org
261fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool Range::AddAndCheckOverflow(const Representation& r, Range* other) {
2625f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  bool may_overflow = false;
263fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  lower_ = AddWithoutOverflow(r, lower_, other->lower(), &may_overflow);
264fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  upper_ = AddWithoutOverflow(r, upper_, other->upper(), &may_overflow);
265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  KeepOrder();
266c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
267a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Verify();
268c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
2695f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return may_overflow;
270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
271a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
272a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
273fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool Range::SubAndCheckOverflow(const Representation& r, Range* other) {
2745f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  bool may_overflow = false;
275fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  lower_ = SubWithoutOverflow(r, lower_, other->upper(), &may_overflow);
276fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  upper_ = SubWithoutOverflow(r, upper_, other->lower(), &may_overflow);
277a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  KeepOrder();
278c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
279a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Verify();
280c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
2815f0c45f2cacb31d36a8f80c31f17bda7751a3644ager@chromium.org  return may_overflow;
282a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
283a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
284a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Range::KeepOrder() {
286a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (lower_ > upper_) {
287a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    int32_t tmp = lower_;
288a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    lower_ = upper_;
289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    upper_ = tmp;
290a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
291a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
292a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
293a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
294c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
295a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid Range::Verify() const {
296e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(lower_ <= upper_);
297a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
298c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
299a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
300a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
301fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool Range::MulAndCheckOverflow(const Representation& r, Range* other) {
302a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool may_overflow = false;
303fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int v1 = MulWithoutOverflow(r, lower_, other->lower(), &may_overflow);
304fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int v2 = MulWithoutOverflow(r, lower_, other->upper(), &may_overflow);
305fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int v3 = MulWithoutOverflow(r, upper_, other->lower(), &may_overflow);
306fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int v4 = MulWithoutOverflow(r, upper_, other->upper(), &may_overflow);
307a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  lower_ = Min(Min(v1, v2), Min(v3, v4));
308a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  upper_ = Max(Max(v1, v2), Max(v3, v4));
309c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#ifdef DEBUG
310a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  Verify();
311c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org#endif
312a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return may_overflow;
313a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
314a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
315a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3163847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.combool HValue::IsDefinedAfter(HBasicBlock* other) const {
3173847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  return block()->block_id() > other->block_id();
3183847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com}
3193847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
3203847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
321ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgHUseListNode* HUseListNode::tail() {
322ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // Skip and remove dead items in the use list.
323ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  while (tail_ != NULL && tail_->value()->CheckFlag(HValue::kIsDead)) {
324ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    tail_ = tail_->tail_;
325ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  }
326ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  return tail_;
327ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org}
328ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
329ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org
330c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgbool HValue::CheckUsesForFlag(Flag f) const {
331812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
332fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    if (it.value()->IsSimulate()) continue;
333812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    if (!it.value()->CheckFlag(f)) return false;
334812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  }
335812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return true;
336812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
337812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
338812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
339662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgbool HValue::CheckUsesForFlag(Flag f, HValue** value) const {
340662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
341662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    if (it.value()->IsSimulate()) continue;
342662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    if (!it.value()->CheckFlag(f)) {
343662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      *value = it.value();
344662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      return false;
345662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    }
346662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  }
347662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  return true;
348662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
349662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
350662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
351c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgbool HValue::HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const {
352837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  bool return_value = false;
353837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
354837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    if (it.value()->IsSimulate()) continue;
355837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    if (!it.value()->CheckFlag(f)) return false;
356837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org    return_value = true;
357837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  }
358837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  return return_value;
359837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org}
360837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
361837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org
3623847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comHUseIterator::HUseIterator(HUseListNode* head) : next_(head) {
3633847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  Advance();
3643847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com}
3653847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
3663847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
3673847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comvoid HUseIterator::Advance() {
3683847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  current_ = next_;
3693847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  if (current_ != NULL) {
3703847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    next_ = current_->tail();
3713847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    value_ = current_->value();
3723847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    index_ = current_->index();
373a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
374a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
375a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
376a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3773847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comint HValue::UseCount() const {
3783847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  int count = 0;
3793847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  for (HUseIterator it(uses()); !it.Done(); it.Advance()) ++count;
3803847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  return count;
381a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
383a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3843847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comHUseListNode* HValue::RemoveUse(HValue* value, int index) {
3853847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  HUseListNode* previous = NULL;
3863847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  HUseListNode* current = use_list_;
3873847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  while (current != NULL) {
3883847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    if (current->value() == value && current->index() == index) {
3893847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com      if (previous == NULL) {
3903847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com        use_list_ = current->tail();
3913847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com      } else {
3923847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com        previous->set_tail(current->tail());
3933847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com      }
3943847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com      break;
395a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
3963847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
3973847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    previous = current;
3983847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    current = current->tail();
399a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
4003847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
4013847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com#ifdef DEBUG
4023847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  // Do not reuse use list nodes in debug mode, zap them.
4033847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  if (current != NULL) {
4043847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    HUseListNode* temp =
4057028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        new(block()->zone())
4067028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org        HUseListNode(current->value(), current->index(), NULL);
4073847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    current->Zap();
4083847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    current = temp;
4093847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  }
4103847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com#endif
4113847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  return current;
412a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
413a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
414a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4153a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgbool HValue::Equals(HValue* other) {
416a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (other->opcode() != opcode()) return false;
417a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (!other->representation().Equals(representation())) return false;
418a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (!other->type_.Equals(type_)) return false;
41931b1277ec3b8cd17acb01c66d85a456159072157kmillikin@chromium.org  if (other->flags() != flags()) return false;
420a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (OperandCount() != other->OperandCount()) return false;
421a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
422a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (OperandAt(i)->id() != other->OperandAt(i)->id()) return false;
423a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
424a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool result = DataEquals(other);
425e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!result || Hashcode() == other->Hashcode());
426a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return result;
427a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
428a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
429a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4303a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgintptr_t HValue::Hashcode() {
431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  intptr_t result = opcode();
432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int count = OperandCount();
433a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < count; ++i) {
434a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    result = result * 19 + OperandAt(i)->id() + (result >> 7);
435a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
436a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return result;
437a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
438a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
439a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
440dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.orgconst char* HValue::Mnemonic() const {
441dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org  switch (opcode()) {
442dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org#define MAKE_CASE(type) case k##type: return #type;
443dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org    HYDROGEN_CONCRETE_INSTRUCTION_LIST(MAKE_CASE)
444dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org#undef MAKE_CASE
445dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org    case kPhi: return "Phi";
446dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org    default: return "";
447dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org  }
448dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org}
449dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org
450dcebac0f4c6c0da579b7cc91a0cbba8f3c820c8dricow@chromium.org
451d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgbool HValue::CanReplaceWithDummyUses() {
452d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return FLAG_unreachable_code_elimination &&
453d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org      !(block()->IsReachable() ||
454d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        IsBlockEntry() ||
455d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        IsControlInstruction() ||
4562ebef182c49d59eba907b120c3c2a50808bd1f12machenbach@chromium.org        IsArgumentsObject() ||
457255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org        IsCapturedObject() ||
458d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        IsSimulate() ||
459d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        IsEnterInlined() ||
460d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        IsLeaveInlined());
461d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
462d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
463d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
4647c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgbool HValue::IsInteger32Constant() {
4659af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return IsConstant() && HConstant::cast(this)->HasInteger32Value();
4667c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
4677c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
4687c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
4697c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.orgint32_t HValue::GetInteger32Constant() {
4709af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  return HConstant::cast(this)->Integer32Value();
4717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
4727c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
4737c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
474b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgbool HValue::EqualsInteger32Constant(int32_t value) {
475b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  return IsInteger32Constant() && GetInteger32Constant() == value;
476b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
477b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
478b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HValue::SetOperandAt(int index, HValue* value) {
480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  RegisterUse(index, value);
481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  InternalSetOperandAt(index, value);
482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4853847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comvoid HValue::DeleteAndReplaceWith(HValue* other) {
4863847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  // We replace all uses first, so Delete can assert that there are none.
4873847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  if (other != NULL) ReplaceAllUsesWith(other);
488ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  Kill();
489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  DeleteFromGraph();
490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
492a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4933847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.comvoid HValue::ReplaceAllUsesWith(HValue* other) {
4943847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  while (use_list_ != NULL) {
4953847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    HUseListNode* list_node = use_list_;
4963847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    HValue* value = list_node->value();
497e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!value->block()->IsStartBlock());
4983847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    value->InternalSetOperandAt(list_node->index(), other);
4993847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    use_list_ = list_node->tail();
5003847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    list_node->set_tail(other->use_list_);
5013847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    other->use_list_ = list_node;
502a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
503a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
504a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
505a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
506ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.orgvoid HValue::Kill() {
507ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // Instead of going through the entire use list of each operand, we only
508ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // check the first item in each use list and rely on the tail() method to
509ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  // skip dead items, removing them lazily next time we traverse the list.
510ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org  SetFlag(kIsDead);
5113847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  for (int i = 0; i < OperandCount(); ++i) {
512ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    HValue* operand = OperandAt(i);
513efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    if (operand == NULL) continue;
514ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    HUseListNode* first = operand->use_list_;
515e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    if (first != NULL && first->value()->CheckFlag(kIsDead)) {
516ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org      operand->use_list_ = first->tail();
517ab30bb83bf3dae0053739c57b1db9ad13c1f9e3ayangguo@chromium.org    }
518a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
519a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
520a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
521a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
522a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HValue::SetBlock(HBasicBlock* block) {
523e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(block_ == NULL || block == NULL);
524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  block_ = block;
525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (id_ == kNoNumber && block != NULL) {
526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    id_ = block->graph()->GetNextValueID(this);
527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
529a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
530a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
531f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const HValue& v) { return v.PrintTo(os); }
532d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
533d0bddc653152f270a27fe32d5d7b0f5c0fa3b00cmachenbach@chromium.org
534f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const TypeOf& t) {
535f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (t.value->representation().IsTagged() &&
536f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      !t.value->type().Equals(HType::Tagged()))
537f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    return os;
538f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << " type:" << t.value->type();
53983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org}
54083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
54183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
542f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const ChangesOf& c) {
543f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  GVNFlagSet changes_flags = c.value->ChangesFlags();
544f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (changes_flags.IsEmpty()) return os;
545f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << " changes[";
546f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (changes_flags == c.value->AllSideEffectsFlagSet()) {
547f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "*";
54883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  } else {
54983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    bool add_comma = false;
550f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org#define PRINT_DO(Type)                   \
551f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (changes_flags.Contains(k##Type)) { \
552f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (add_comma) os << ",";            \
553f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    add_comma = true;                    \
554f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << #Type;                         \
555f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  }
55628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    GVN_TRACKED_FLAG_LIST(PRINT_DO);
55728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    GVN_UNTRACKED_FLAG_LIST(PRINT_DO);
55883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org#undef PRINT_DO
55983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
560f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "]";
561a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
562a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
564d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.orgbool HValue::HasMonomorphicJSObjectType() {
565d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org  return !GetMonomorphicJSObjectMap().is_null();
566d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org}
567d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
568d16d8531698e91e9c60a7db9e0ba3c3bb15aff20mvstanton@chromium.org
569a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgbool HValue::UpdateInferredType() {
570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HType type = CalculateInferredType();
571a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  bool result = (!type.Equals(type_));
572a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  type_ = type;
573a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return result;
574a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
575a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
576a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HValue::RegisterUse(int index, HValue* new_value) {
578a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HValue* old_value = OperandAt(index);
579a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (old_value == new_value) return;
5803847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
5813847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  HUseListNode* removed = NULL;
5823847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  if (old_value != NULL) {
5833847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    removed = old_value->RemoveUse(this, index);
5843847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  }
5853847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com
586a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (new_value != NULL) {
5873847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    if (removed == NULL) {
5887028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      new_value->use_list_ = new(new_value->block()->zone()) HUseListNode(
5897028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org          this, index, new_value->use_list_);
5903847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    } else {
5913847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com      removed->set_tail(new_value->use_list_);
5923847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com      new_value->use_list_ = removed;
5933847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    }
594a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
595a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
596a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
597a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
598812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid HValue::AddNewRange(Range* r, Zone* zone) {
599812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  if (!HasRange()) ComputeInitialRange(zone);
600812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  if (!HasRange()) range_ = new(zone) Range();
601e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(HasRange());
602a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  r->StackUpon(range_);
603a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  range_ = r;
604a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
605a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
606a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
607a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HValue::RemoveLastAddedRange() {
608e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(HasRange());
609e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(range_->next() != NULL);
610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  range_ = range_->next();
611a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
612a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
613a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
614812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgvoid HValue::ComputeInitialRange(Zone* zone) {
615e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!HasRange());
616812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  range_ = InferRange(zone);
617e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(HasRange());
618a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
619a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
620a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
621f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const HSourcePosition& p) {
622f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (p.IsUnknown()) {
623f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    return os << "<?>";
624f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  } else if (FLAG_hydrogen_track_positions) {
625f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    return os << "<" << p.inlining_id() << ":" << p.position() << ">";
626f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  } else {
627f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    return os << "<0:" << p.raw() << ">";
628f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
629f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org}
630f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
631f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
632f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HInstruction::PrintTo(OStream& os) const {  // NOLINT
633f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << Mnemonic() << " ";
634f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  PrintDataTo(os) << ChangesOf(this) << TypeOf(this);
635f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CheckFlag(HValue::kHasNoObservableSideEffects)) os << " [noOSE]";
636f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CheckFlag(HValue::kIsDead)) os << " [dead]";
637f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
63883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org}
639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
640a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
641f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HInstruction::PrintDataTo(OStream& os) const {  // NOLINT
6424e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
643f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (i > 0) os << " ";
644f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << NameOf(OperandAt(i));
6454e308cf00936c6e7bead43e5141a04e37b49b9b5jkummerow@chromium.org  }
646f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
647a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
649a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
650a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HInstruction::Unlink() {
651e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsLinked());
652e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsControlInstruction());  // Must never move control instructions.
653e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsBlockEntry());  // Doesn't make sense to delete these.
654e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(previous_ != NULL);
65549edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  previous_->next_ = next_;
65649edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  if (next_ == NULL) {
657e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block()->last() == this);
65849edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    block()->set_last(previous_);
65949edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  } else {
66049edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org    next_->previous_ = previous_;
66149edbdf52640c88918f8e6638ab4965819eb1dfekmillikin@chromium.org  }
662a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  clear_block();
663a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
664a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
665a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
666a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HInstruction::InsertBefore(HInstruction* next) {
667e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsLinked());
668e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!next->IsBlockEntry());
669e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsControlInstruction());
670e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!next->block()->IsStartBlock());
671e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(next->previous_ != NULL);
672a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction* prev = next->previous();
673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  prev->next_ = this;
674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next->previous_ = this;
675a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next_ = next;
676a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  previous_ = prev;
677a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  SetBlock(next->block());
678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!has_position() && next->has_position()) {
67971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org    set_position(next->position());
68071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  }
681a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
682a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
683a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
684a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HInstruction::InsertAfter(HInstruction* previous) {
685e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsLinked());
686e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!previous->IsControlInstruction());
687e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!IsControlInstruction() || previous->next_ == NULL);
688a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HBasicBlock* block = previous->block();
689a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Never insert anything except constants into the start block after finishing
690a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // it.
691a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (block->IsStartBlock() && block->IsFinished() && !IsConstant()) {
692e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block->end()->SecondSuccessor() == NULL);
693a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    InsertAfter(block->end()->FirstSuccessor()->first());
694a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return;
695a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
696a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
697a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // If we're inserting after an instruction with side-effects that is
698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // followed by a simulate instruction, we need to insert after the
699a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // simulate instruction instead.
700a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction* next = previous->next_;
701c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (previous->HasObservableSideEffects() && next != NULL) {
702e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(next->IsSimulate());
703a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    previous = next;
704a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    next = previous->next_;
705a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
706a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
707a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  previous_ = previous;
708a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  next_ = next;
709a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  SetBlock(block);
710a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  previous->next_ = this;
711a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (next != NULL) next->previous_ = this;
71228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  if (block->last() == previous) {
71328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    block->set_last(this);
71428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  }
715f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (!has_position() && previous->has_position()) {
71671f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org    set_position(previous->position());
71771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  }
718a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
719a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
720a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
72138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.orgbool HInstruction::Dominates(HInstruction* other) {
72238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  if (block() != other->block()) {
72338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    return block()->Dominates(other->block());
72438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  }
72538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  // Both instructions are in the same basic block. This instruction
72638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  // should precede the other one in order to dominate it.
72738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  for (HInstruction* instr = next(); instr != NULL; instr = instr->next()) {
72838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    if (instr == other) {
72938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      return true;
73038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    }
73138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  }
73238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  return false;
73338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org}
73438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
73538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
736a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG
737378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid HInstruction::Verify() {
738a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Verify that input operands are defined before use.
739a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HBasicBlock* cur_block = block();
740a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
741a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HValue* other_operand = OperandAt(i);
742efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    if (other_operand == NULL) continue;
743a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* other_block = other_operand->block();
744a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (cur_block == other_block) {
745a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      if (!other_operand->IsPhi()) {
746394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com        HInstruction* cur = this->previous();
747a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        while (cur != NULL) {
748a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org          if (cur == other_operand) break;
749394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com          cur = cur->previous();
750a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        }
751a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        // Must reach other operand in the same block!
752e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org        DCHECK(cur == other_operand);
753a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
754a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
755c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org      // If the following assert fires, you may have forgotten an
756c53e10d01c5495df3896b9d318910b58688c6929kmillikin@chromium.org      // AddInstruction.
757e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(other_block->Dominates(cur_block));
758a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
759a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
760a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
761a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Verify that instructions that may have side-effects are followed
762a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // by a simulate instruction.
763c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  if (HasObservableSideEffects() && !IsOsrEntry()) {
764e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(next()->IsSimulate());
765a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
766378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org
767378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  // Verify that instructions that can be eliminated by GVN have overridden
768378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  // HValue::DataEquals.  The default implementation is UNREACHABLE.  We
769378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  // don't actually care whether DataEquals returns true or false here.
770378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org  if (CheckFlag(kUseGVN)) DataEquals(this);
7717c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
7727c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  // Verify that all uses are in the graph.
7737c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  for (HUseIterator use = uses(); !use.Done(); use.Advance()) {
7747c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    if (use.value()->IsInstruction()) {
775e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(HInstruction::cast(use.value())->IsLinked());
7767c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org    }
7777c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  }
778a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif
780a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
781a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
782b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.orgbool HInstruction::CanDeoptimize() {
783b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  // TODO(titzer): make this a virtual method?
784b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  switch (opcode()) {
785255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kAbnormalExit:
786b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kAccessArgumentsAt:
787255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kAllocate:
788b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kArgumentsElements:
789b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kArgumentsLength:
790b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kArgumentsObject:
791255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kBlockEntry:
792b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kBoundsCheckBaseIndexInformation:
793255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCallFunction:
794255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCallNew:
795255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCallNewArray:
796255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCallStub:
797255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCallWithDescriptor:
798b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kCapturedObject:
799255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kClassOfTestAndBranch:
800255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCompareGeneric:
801255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCompareHoleAndBranch:
802255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCompareMap:
803255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCompareMinusZeroAndBranch:
804255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCompareNumericAndBranch:
805255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCompareObjectEqAndBranch:
806b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kConstant:
807255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kConstructDouble:
808b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kContext:
809b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kDebugBreak:
810b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kDeclareGlobals:
811255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kDoubleBits:
812b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kDummyUse:
813b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kEnterInlined:
814b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kEnvironmentMarker:
815255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kForceRepresentation:
816b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kGetCachedArrayIndex:
817b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kGoto:
818255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kHasCachedArrayIndexAndBranch:
819255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kHasInstanceTypeAndBranch:
820b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kInnerAllocatedObject:
821b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kInstanceOf:
822b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kInstanceOfKnownGlobal:
823255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kIsConstructCallAndBranch:
824255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kIsObjectAndBranch:
825255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kIsSmiAndBranch:
826255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kIsStringAndBranch:
827255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kIsUndetectableAndBranch:
828b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kLeaveInlined:
829b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kLoadFieldByIndex:
830b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kLoadGlobalGeneric:
831b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kLoadNamedField:
832b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kLoadNamedGeneric:
833b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kLoadRoot:
834b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kMapEnumLength:
835b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kMathMinMax:
836b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kParameter:
837255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kPhi:
838011a81ffd5df0e081e7c00ef430b2fec5079bf2amachenbach@chromium.org    case HValue::kPushArguments:
839255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kRegExpLiteral:
840255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kReturn:
841b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kSeqStringGetChar:
842255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kStoreCodeEntry:
8431e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    case HValue::kStoreFrameContext:
844255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kStoreKeyed:
845d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org    case HValue::kStoreNamedField:
846255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kStoreNamedGeneric:
847255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kStringCharCodeAt:
848255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kStringCharFromCode:
849e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    case HValue::kTailCallThroughMegamorphicCache:
850255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kThisFunction:
851255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kTypeofIsAndBranch:
852255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kUnknownOSRValue:
853255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kUseConst:
854255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org      return false;
855255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org
856255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kAdd:
8571e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org    case HValue::kAllocateBlockContext:
858255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kApplyArguments:
859255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kBitwise:
860255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kBoundsCheck:
861255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kBranch:
8628d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    case HValue::kCallJSFunction:
863255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCallRuntime:
864255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kChange:
865255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCheckHeapObject:
866255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCheckInstanceType:
867255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCheckMapValue:
868255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCheckMaps:
869255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCheckSmi:
870255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kCheckValue:
871255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kClampToUint8:
872255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kDateField:
873255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kDeoptimize:
874255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kDiv:
875255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kForInCacheArray:
876255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kForInPrepareMap:
877255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kFunctionLiteral:
878255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kInvokeFunction:
879255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kLoadContextSlot:
880255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kLoadFunctionPrototype:
881255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kLoadGlobalCell:
882255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kLoadKeyed:
883255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kLoadKeyedGeneric:
884255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kMathFloorOfDiv:
885255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kMod:
886255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kMul:
887255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kOsrEntry:
888255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kPower:
889eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    case HValue::kRor:
890eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org    case HValue::kSar:
891b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kSeqStringSetChar:
892b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kShl:
893b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kShr:
894b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kSimulate:
895b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kStackCheck:
896b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kStoreContextSlot:
897b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kStoreGlobalCell:
898b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kStoreKeyedGeneric:
899b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kStringAdd:
900255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org    case HValue::kStringCompareAndBranch:
901b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kSub:
902b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kToFastProperties:
903b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kTransitionElementsKind:
904b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kTrapAllocationMemento:
905b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kTypeof:
906b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kUnaryMathOperation:
907b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org    case HValue::kWrapReceiver:
908b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      return true;
909b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org  }
910255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  UNREACHABLE();
911255043f8054e713a64509c707cfabadd42344683machenbach@chromium.org  return true;
912b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org}
913b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org
914b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org
915f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const NameOf& v) {
916f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << v.value->representation().Mnemonic() << v.value->id();
917f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org}
918f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org
919f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HDummyUse::PrintDataTo(OStream& os) const {  // NOLINT
920f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value());
92146a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org}
92246a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
92346a2a51ad190697e0f62c3060ce02a9de5820a07yangguo@chromium.org
924f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HEnvironmentMarker::PrintDataTo(OStream& os) const {  // NOLINT
925f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << (kind() == BIND ? "bind" : "lookup") << " var[" << index()
926f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << "]";
927d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
928d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
929d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
930f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HUnaryCall::PrintDataTo(OStream& os) const {  // NOLINT
931f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value()) << " #" << argument_count();
932496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org}
933496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
934496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
935f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCallJSFunction::PrintDataTo(OStream& os) const {  // NOLINT
936f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(function()) << " #" << argument_count();
93726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
93826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
93926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
94026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.orgHCallJSFunction* HCallJSFunction::New(
94126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    Zone* zone,
94226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HValue* context,
94326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HValue* function,
94426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    int argument_count,
94526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    bool pass_argument_count) {
94626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  bool has_stack_check = false;
94726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  if (function->IsConstant()) {
94826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    HConstant* fun_const = HConstant::cast(function);
94926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    Handle<JSFunction> jsfun =
95026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org        Handle<JSFunction>::cast(fun_const->handle(zone->isolate()));
95126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org    has_stack_check = !jsfun.is_null() &&
95226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org        (jsfun->code()->kind() == Code::FUNCTION ||
95326ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org         jsfun->code()->kind() == Code::OPTIMIZED_FUNCTION);
95426ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  }
95526ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
95626ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  return new(zone) HCallJSFunction(
95726ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org      function, argument_count, pass_argument_count,
95826ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org      has_stack_check);
95926ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org}
96026ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
96126ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org
962f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HBinaryCall::PrintDataTo(OStream& os) const {  // NOLINT
963f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(first()) << " " << NameOf(second()) << " #"
964f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << argument_count();
965496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org}
966496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
967496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
968876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.orgvoid HBoundsCheck::ApplyIndexChange() {
969876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (skip_check()) return;
970876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
971876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  DecompositionResult decomposition;
972876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  bool index_is_decomposable = index()->TryDecompose(&decomposition);
973876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (index_is_decomposable) {
974e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(decomposition.base() == base());
975876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    if (decomposition.offset() == offset() &&
976876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org        decomposition.scale() == scale()) return;
977876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  } else {
978876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    return;
979876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
980876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
981876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  ReplaceAllUsesWith(index());
982876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
983876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  HValue* current_index = decomposition.base();
984876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  int actual_offset = decomposition.offset() + offset();
985876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  int actual_scale = decomposition.scale() + scale();
986876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
987d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Zone* zone = block()->graph()->zone();
988d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  HValue* context = block()->graph()->GetInvalidContext();
989876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (actual_offset != 0) {
990d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    HConstant* add_offset = HConstant::New(zone, context, actual_offset);
991876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    add_offset->InsertBefore(this);
992d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    HInstruction* add = HAdd::New(zone, context,
993d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                  current_index, add_offset);
994876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    add->InsertBefore(this);
995876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    add->AssumeRepresentation(index()->representation());
9961fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    add->ClearFlag(kCanOverflow);
997876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    current_index = add;
998876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
999876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1000876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (actual_scale != 0) {
1001d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    HConstant* sar_scale = HConstant::New(zone, context, actual_scale);
1002876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    sar_scale->InsertBefore(this);
1003d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    HInstruction* sar = HSar::New(zone, context,
1004d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                  current_index, sar_scale);
1005876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    sar->InsertBefore(this);
1006876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    sar->AssumeRepresentation(index()->representation());
1007876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    current_index = sar;
1008876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  }
1009876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1010876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  SetOperandAt(0, current_index);
1011876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1012876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  base_ = NULL;
1013876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  offset_ = 0;
1014876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  scale_ = 0;
10157c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org}
10167c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
10177c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org
1018f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HBoundsCheck::PrintDataTo(OStream& os) const {  // NOLINT
1019f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(index()) << " " << NameOf(length());
1020876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org  if (base() != NULL && (offset() != 0 || scale() != 0)) {
1021f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << " base: ((";
1022876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    if (base() != index()) {
1023f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << NameOf(index());
1024876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    } else {
1025f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "index";
1026876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org    }
1027f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << " + " << offset() << ") >> " << scale() << ")";
10287c3372bc426136cb79479c1b59d1770f5528882ahpayer@chromium.org  }
1029f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (skip_check()) os << " [DISABLED]";
1030f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
10314acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org}
10324acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
1033ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
10341510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HBoundsCheck::InferRepresentation(HInferRepresentationPhase* h_infer) {
1035e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CheckFlag(kFlexibleRepresentation));
1036750145ab1b720c97adf2b548cc8fbd28c8b8e06dulan@chromium.org  HValue* actual_index = index()->ActualValue();
1037b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  HValue* actual_length = length()->ActualValue();
1038b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org  Representation index_rep = actual_index->representation();
1039b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  Representation length_rep = actual_length->representation();
10401510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (index_rep.IsTagged() && actual_index->type().IsSmi()) {
10411510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    index_rep = Representation::Smi();
10421510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
10431510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (length_rep.IsTagged() && actual_length->type().IsSmi()) {
10441510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    length_rep = Representation::Smi();
10451510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
1046b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  Representation r = index_rep.generalize(length_rep);
1047b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  if (r.is_more_general_than(Representation::Integer32())) {
1048068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org    r = Representation::Integer32();
1049068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  }
1050068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org  UpdateRepresentation(r, h_infer, "boundscheck");
1051068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org}
1052068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
1053068ea0a6ea115c058d1d9798029bd7fa1eaaa955mstarzinger@chromium.org
1054c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.orgRange* HBoundsCheck::InferRange(Zone* zone) {
1055c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  Representation r = representation();
1056c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  if (r.IsSmiOrInteger32() && length()->HasRange()) {
1057c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    int upper = length()->range()->upper() - (allow_equality() ? 0 : 1);
1058c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    int lower = 0;
1059c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1060c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    Range* result = new(zone) Range(lower, upper);
1061c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (index()->HasRange()) {
1062c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org      result->Intersect(index()->range());
1063c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    }
1064c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1065c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    // In case of Smi representation, clamp result to Smi::kMaxValue.
1066c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    if (r.IsSmi()) result->ClampToSmi();
1067c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org    return result;
1068c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  }
1069c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org  return HValue::InferRange(zone);
1070c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org}
1071c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1072c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org
1073f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HBoundsCheckBaseIndexInformation::PrintDataTo(
1074f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    OStream& os) const {  // NOLINT
1075f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  // TODO(svenpanne) This 2nd base_index() looks wrong...
1076f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "base: " << NameOf(base_index())
1077f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << ", check: " << NameOf(base_index());
1078876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org}
1079876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1080876cca833d7212e476250d102cad185cdcfa9dfesvenpanne@chromium.org
1081f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCallWithDescriptor::PrintDataTo(OStream& os) const {  // NOLINT
108226ca35cc4ec47151d9c6d3890b0f052fc79cb8afmachenbach@chromium.org  for (int i = 0; i < OperandCount(); i++) {
1083f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << NameOf(OperandAt(i)) << " ";
1084a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1085f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "#" << argument_count();
1086496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org}
1087496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
1088496c03a64f12710e837204e261ef155601247895sgjesse@chromium.org
1089f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCallNewArray::PrintDataTo(OStream& os) const {  // NOLINT
1090f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << ElementsKindToString(elements_kind()) << " ";
1091f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HBinaryCall::PrintDataTo(os);
10921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org}
10931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
10941510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org
1095f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCallRuntime::PrintDataTo(OStream& os) const {  // NOLINT
1096f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << name()->ToCString().get() << " ";
1097f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (save_doubles() == kSaveFPRegs) os << "[save doubles] ";
1098f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "#" << argument_count();
1099a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1100a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1102f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HClassOfTestAndBranch::PrintDataTo(OStream& os) const {  // NOLINT
1103f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "class_of_test(" << NameOf(value()) << ", \""
1104f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << class_name()->ToCString().get() << "\")";
1105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1108f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HWrapReceiver::PrintDataTo(OStream& os) const {  // NOLINT
1109f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(receiver()) << " " << NameOf(function());
111039110192b21bd92be3d617690fc33b4e9551b95dyangguo@chromium.org}
111139110192b21bd92be3d617690fc33b4e9551b95dyangguo@chromium.org
111239110192b21bd92be3d617690fc33b4e9551b95dyangguo@chromium.org
1113f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HAccessArgumentsAt::PrintDataTo(OStream& os) const {  // NOLINT
1114f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(arguments()) << "[" << NameOf(index()) << "], length "
1115f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << NameOf(length());
1116a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1117a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1118a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1119f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HAllocateBlockContext::PrintDataTo(OStream& os) const {  // NOLINT
1120f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(context()) << " " << NameOf(function());
11211e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org}
11221e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
11231e2d50cf3d94ff48285da107b7a9da1ad0fc873dmachenbach@chromium.org
1124f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HControlInstruction::PrintDataTo(OStream& os) const {  // NOLINT
1125f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << " goto (";
11266d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  bool first_block = true;
11276d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org  for (HSuccessorIterator it(this); !it.Done(); it.Advance()) {
1128f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (!first_block) os << ", ";
1129f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << *it.Current();
11306d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org    first_block = false;
11310a4e901cdfb5505a896d30aa8c2e04fce0fbe069vegorov@chromium.org  }
1132f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << ")";
1133a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1136f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HUnaryControlInstruction::PrintDataTo(OStream& os) const {  // NOLINT
1137f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(value());
1138f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HControlInstruction::PrintDataTo(os);
1139a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1140a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1142f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HReturn::PrintDataTo(OStream& os) const {  // NOLINT
1143f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value()) << " (pop " << NameOf(parameter_count())
1144f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << " values)";
11456d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org}
11466d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
11476d786c9805481bd13ecb29c3155540f2f32950e1svenpanne@chromium.org
1148fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgRepresentation HBranch::observed_input_representation(int index) {
1149fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  static const ToBooleanStub::Types tagged_types(
1150fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      ToBooleanStub::NULL_TYPE |
1151fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      ToBooleanStub::SPEC_OBJECT |
1152f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      ToBooleanStub::STRING |
1153f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org      ToBooleanStub::SYMBOL);
1154fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  if (expected_input_types_.ContainsAnyOf(tagged_types)) {
1155fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    return Representation::Tagged();
11561510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
11571510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (expected_input_types_.Contains(ToBooleanStub::UNDEFINED)) {
11581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    if (expected_input_types_.Contains(ToBooleanStub::HEAP_NUMBER)) {
11591510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      return Representation::Double();
11601510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    }
11611510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    return Representation::Tagged();
11621510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
11631510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (expected_input_types_.Contains(ToBooleanStub::HEAP_NUMBER)) {
1164fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    return Representation::Double();
11651510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  }
11661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (expected_input_types_.Contains(ToBooleanStub::SMI)) {
1167b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    return Representation::Smi();
1168fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
11691510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  return Representation::None();
1170fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
1171fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
1172fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
1173d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgbool HBranch::KnownSuccessorBlock(HBasicBlock** block) {
1174d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  HValue* value = this->value();
1175d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  if (value->EmitAtUses()) {
1176e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(value->IsConstant());
1177e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(!value->representation().IsDouble());
1178d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    *block = HConstant::cast(value)->BooleanValue()
1179d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        ? FirstSuccessor()
1180d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org        : SecondSuccessor();
1181d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    return true;
1182d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  }
1183d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  *block = NULL;
1184d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return false;
1185d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
1186d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
1187d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
1188f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HBranch::PrintDataTo(OStream& os) const {  // NOLINT
1189f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HUnaryControlInstruction::PrintDataTo(os) << " "
1190f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org                                                   << expected_input_types();
1191a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org}
1192a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
1193a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
1194f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCompareMap::PrintDataTo(OStream& os) const {  // NOLINT
1195f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(value()) << " (" << *map().handle() << ")";
1196f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  HControlInstruction::PrintDataTo(os);
11978297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  if (known_successor_index() == 0) {
1198f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << " [true]";
11998297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  } else if (known_successor_index() == 1) {
1200f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << " [false]";
12018297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  }
1202f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
1203a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1204a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1205a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1206a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgconst char* HUnaryMathOperation::OpName() const {
1207a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  switch (op()) {
1208dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFloor:
1209dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "floor";
1210dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathFround:
1211dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "fround";
1212dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathRound:
1213dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "round";
1214dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathAbs:
1215dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "abs";
1216dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathLog:
1217dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "log";
1218dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathExp:
1219dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "exp";
1220dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathSqrt:
1221dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "sqrt";
1222dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathPowHalf:
1223dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "pow-half";
1224dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    case kMathClz32:
1225dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      return "clz32";
1226ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    default:
1227ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      UNREACHABLE();
1228ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      return NULL;
1229a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1230a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1231a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1232a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
12331fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgRange* HUnaryMathOperation::InferRange(Zone* zone) {
12341fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Representation r = representation();
1235f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (op() == kMathClz32) return new(zone) Range(0, 32);
12361fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  if (r.IsSmiOrInteger32() && value()->HasRange()) {
12371fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    if (op() == kMathAbs) {
12381fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      int upper = value()->range()->upper();
12391fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      int lower = value()->range()->lower();
12401fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      bool spans_zero = value()->range()->CanBeZero();
12411fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      // Math.abs(kMinInt) overflows its representation, on which the
12421fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      // instruction deopts. Hence clamp it to kMaxInt.
12431fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      int abs_upper = upper == kMinInt ? kMaxInt : abs(upper);
12441fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      int abs_lower = lower == kMinInt ? kMaxInt : abs(lower);
12451fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      Range* result =
12461fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org          new(zone) Range(spans_zero ? 0 : Min(abs_lower, abs_upper),
12471fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org                          Max(abs_lower, abs_upper));
12481fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      // In case of Smi representation, clamp Math.abs(Smi::kMinValue) to
12491fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      // Smi::kMaxValue.
12501fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      if (r.IsSmi()) result->ClampToSmi();
12511fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org      return result;
12521fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org    }
12531fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  }
12541fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return HValue::InferRange(zone);
12551fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
12561fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
12571fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
1258f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HUnaryMathOperation::PrintDataTo(OStream& os) const {  // NOLINT
1259f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << OpName() << " " << NameOf(value());
1260a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1261a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1262a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1263f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HUnaryOperation::PrintDataTo(OStream& os) const {  // NOLINT
1264f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value());
1265a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1266a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1267a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1268f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HHasInstanceTypeAndBranch::PrintDataTo(OStream& os) const {  // NOLINT
1269f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(value());
1270a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  switch (from_) {
1271d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org    case FIRST_JS_RECEIVER_TYPE:
1272f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (to_ == LAST_TYPE) os << " spec_object";
1273a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      break;
1274a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case JS_REGEXP_TYPE:
1275f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (to_ == JS_REGEXP_TYPE) os << " reg_exp";
1276a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      break;
1277a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case JS_ARRAY_TYPE:
1278f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (to_ == JS_ARRAY_TYPE) os << " array";
1279a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      break;
1280a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    case JS_FUNCTION_TYPE:
1281f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (to_ == JS_FUNCTION_TYPE) os << " function";
1282a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      break;
1283a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    default:
1284a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      break;
1285a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1286f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
1287a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1288a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1289a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1290f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HTypeofIsAndBranch::PrintDataTo(OStream& os) const {  // NOLINT
1291f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(value()) << " == " << type_literal()->ToCString().get();
1292f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HControlInstruction::PrintDataTo(os);
1293c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1294c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1295c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1296bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgstatic String* TypeOfString(HConstant* constant, Isolate* isolate) {
1297bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  Heap* heap = isolate->heap();
1298bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (constant->HasNumberValue()) return heap->number_string();
1299bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (constant->IsUndetectable()) return heap->undefined_string();
1300bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (constant->HasStringValue()) return heap->string_string();
1301bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  switch (constant->GetInstanceType()) {
1302bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    case ODDBALL_TYPE: {
1303bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      Unique<Object> unique = constant->GetUnique();
1304bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      if (unique.IsKnownGlobal(heap->true_value()) ||
1305bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org          unique.IsKnownGlobal(heap->false_value())) {
1306bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        return heap->boolean_string();
1307bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      }
1308bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      if (unique.IsKnownGlobal(heap->null_value())) {
13099d1a7a8cdb664730cf5703185e85a4716748c564machenbach@chromium.org        return heap->object_string();
1310bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      }
1311e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(unique.IsKnownGlobal(heap->undefined_value()));
1312bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return heap->undefined_string();
1313af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    }
1314bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    case SYMBOL_TYPE:
1315bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return heap->symbol_string();
1316bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    case JS_FUNCTION_TYPE:
1317bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    case JS_FUNCTION_PROXY_TYPE:
1318bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return heap->function_string();
1319bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    default:
1320bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return heap->object_string();
1321bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
1322bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
1323bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1324bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
1325bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool HTypeofIsAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
1326bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && value()->IsConstant()) {
1327bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    HConstant* constant = HConstant::cast(value());
1328bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    String* type_string = TypeOfString(constant, isolate());
1329bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    bool same_type = type_literal_.IsKnownGlobal(type_string);
1330bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    *block = same_type ? FirstSuccessor() : SecondSuccessor();
1331bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return true;
1332bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  } else if (value()->representation().IsSpecialization()) {
1333bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    bool number_type =
1334bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        type_literal_.IsKnownGlobal(isolate()->heap()->number_string());
1335bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    *block = number_type ? FirstSuccessor() : SecondSuccessor();
1336af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org    return true;
1337af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  }
1338af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  *block = NULL;
1339af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org  return false;
1340af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org}
1341af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
1342af9cfcbed5daf6e636e189bce451c6fafdbb127dmachenbach@chromium.org
1343f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCheckMapValue::PrintDataTo(OStream& os) const {  // NOLINT
1344f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value()) << " " << NameOf(map());
1345be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
1346be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1347be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
134829699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.orgHValue* HCheckMapValue::Canonicalize() {
134929699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org  if (map()->IsConstant()) {
135029699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    HConstant* c_map = HConstant::cast(map());
135129699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    return HCheckMaps::CreateAndInsertAfter(
135229699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org        block()->graph()->zone(), value(), c_map->MapValue(),
135329699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org        c_map->HasStableMapValue(), this);
135429699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org  }
135529699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org  return this;
135629699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org}
135729699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org
135829699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org
1359f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HForInPrepareMap::PrintDataTo(OStream& os) const {  // NOLINT
1360f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(enumerable());
1361be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
1362be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1363be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1364f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HForInCacheArray::PrintDataTo(OStream& os) const {  // NOLINT
1365f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(enumerable()) << " " << NameOf(map()) << "[" << idx_
1366f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << "]";
1367be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
1368be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1369be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1370f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadFieldByIndex::PrintDataTo(OStream& os) const {  // NOLINT
1371f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(object()) << " " << NameOf(index());
1372be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
1373be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1374be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
1375594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgstatic bool MatchLeftIsOnes(HValue* l, HValue* r, HValue** negated) {
1376594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (!l->EqualsInteger32Constant(~0)) return false;
1377594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  *negated = r;
1378594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return true;
1379594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
1380594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1381594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1382594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgstatic bool MatchNegationViaXor(HValue* instr, HValue** negated) {
1383594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (!instr->IsBitwise()) return false;
1384594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HBitwise* b = HBitwise::cast(instr);
1385594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return (b->op() == Token::BIT_XOR) &&
1386594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      (MatchLeftIsOnes(b->left(), b->right(), negated) ||
1387594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org       MatchLeftIsOnes(b->right(), b->left(), negated));
1388594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
1389594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1390594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1391594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.orgstatic bool MatchDoubleNegation(HValue* instr, HValue** arg) {
1392594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HValue* negated;
1393594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  return MatchNegationViaXor(instr, &negated) &&
1394594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      MatchNegationViaXor(negated, arg);
1395594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org}
1396594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1397594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org
1398f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comHValue* HBitwise::Canonicalize() {
1399fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!representation().IsSmiOrInteger32()) return this;
1400f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  // If x is an int32, then x & -1 == x, x | 0 == x and x ^ 0 == x.
1401f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  int32_t nop_constant = (op() == Token::BIT_AND) ? -1 : 0;
1402b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  if (left()->EqualsInteger32Constant(nop_constant) &&
140346839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      !right()->CheckFlag(kUint32)) {
1404f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    return right();
1405f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1406b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  if (right()->EqualsInteger32Constant(nop_constant) &&
140746839fbbdee40a3d2d924e8b5b13c4139b0b24f2yangguo@chromium.org      !left()->CheckFlag(kUint32)) {
1408f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com    return left();
1409f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  }
1410594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  // Optimize double negation, a common pattern used for ToInt32(x).
1411594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  HValue* arg;
1412594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (MatchDoubleNegation(this, &arg) && !arg->CheckFlag(kUint32)) {
1413594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    return arg;
141488d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  }
141588d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org  return this;
141688d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org}
141788d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org
141888d326b0935b802e71e3a75e02f31fae8c2af96cmstarzinger@chromium.org
141937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgRepresentation HAdd::RepresentationFromInputs() {
142037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  Representation left_rep = left()->representation();
142137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if (left_rep.IsExternal()) {
142237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    return Representation::External();
142337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  }
142437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  return HArithmeticBinaryOperation::RepresentationFromInputs();
142537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org}
142637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
142737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
142837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.orgRepresentation HAdd::RequiredInputRepresentation(int index) {
142937be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  if (index == 2) {
143037be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    Representation left_rep = left()->representation();
143137be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    if (left_rep.IsExternal()) {
143237be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org      return Representation::Integer32();
143337be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org    }
143437be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  }
143537be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org  return HArithmeticBinaryOperation::RequiredInputRepresentation(index);
143637be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org}
143737be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
143837be408adf363bbe682921a4a690752fa0ec33femachenbach@chromium.org
1439b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgstatic bool IsIdentityOperation(HValue* arg1, HValue* arg2, int32_t identity) {
1440b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  return arg1->representation().IsSpecialization() &&
1441b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org    arg2->EqualsInteger32Constant(identity);
1442b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
1443b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
1444b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
1445b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgHValue* HAdd::Canonicalize() {
1446ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  // Adding 0 is an identity operation except in case of -0: -0 + 0 = +0
1447ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  if (IsIdentityOperation(left(), right(), 0) &&
1448ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org      !left()->representation().IsDouble()) {  // Left could be -0.
1449ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org    return left();
1450ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  }
1451ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  if (IsIdentityOperation(right(), left(), 0) &&
1452ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org      !left()->representation().IsDouble()) {  // Right could be -0.
1453ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org    return right();
1454ed29eb2bdad388c1ce751d68bd4fe6f4f5a7cbc8machenbach@chromium.org  }
1455837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  return this;
1456b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
1457b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
1458b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
1459812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgHValue* HSub::Canonicalize() {
1460b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  if (IsIdentityOperation(left(), right(), 0)) return left();
1461837a67edd9afdbfe1b59482b41693f59c48846ffulan@chromium.org  return this;
1462b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org}
1463b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
1464b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org
1465b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.orgHValue* HMul::Canonicalize() {
1466b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  if (IsIdentityOperation(left(), right(), 1)) return left();
1467b228be01a466e0ba4d8389148671d196b2081f76mstarzinger@chromium.org  if (IsIdentityOperation(right(), left(), 1)) return right();
1468ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  return this;
1469812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org}
1470812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
1471812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org
14728e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.orgbool HMul::MulMinusOne() {
14738e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  if (left()->EqualsInteger32Constant(-1) ||
14748e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org      right()->EqualsInteger32Constant(-1)) {
14758e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org    return true;
14768e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  }
14778e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org
14788e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  return false;
14798e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org}
14808e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org
14818e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org
1482906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgHValue* HMod::Canonicalize() {
1483906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  return this;
1484906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org}
1485906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
1486906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
1487906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgHValue* HDiv::Canonicalize() {
1488662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  if (IsIdentityOperation(left(), right(), 1)) return left();
1489906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  return this;
1490906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org}
1491906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
1492906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
1493f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.comHValue* HChange::Canonicalize() {
1494f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com  return (from().Equals(to())) ? value() : this;
1495f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com}
1496f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1497f2038fb01417bcf7698b87a5dfaa4a861539618aerik.corry@gmail.com
1498154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.orgHValue* HWrapReceiver::Canonicalize() {
1499154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  if (HasNoUses()) return NULL;
1500154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  if (receiver()->type().IsJSObject()) {
1501154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org    return receiver();
1502154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  }
1503154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org  return this;
1504154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org}
1505154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1506154ff99473e866f5eb00a44045e27866a7fdce29yangguo@chromium.org
1507f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HTypeof::PrintDataTo(OStream& os) const {  // NOLINT
1508f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value());
1509a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1510a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1511a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
15129af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.orgHInstruction* HForceRepresentation::New(Zone* zone, HValue* context,
1513486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org       HValue* value, Representation representation) {
15149af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  if (FLAG_fold_constants && value->IsConstant()) {
15159af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org    HConstant* c = HConstant::cast(value);
1516fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    c = c->CopyToRepresentation(representation, zone);
1517fa7f914e3bacba481b13da5cf2bc4c935567ebc4machenbach@chromium.org    if (c != NULL) return c;
15189af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org  }
1519486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  return new(zone) HForceRepresentation(value, representation);
15209af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org}
15219af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
15229af454f6b1c6a921ac79ba0b9a979c73adb2ca1emachenbach@chromium.org
1523f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HForceRepresentation::PrintDataTo(OStream& os) const {  // NOLINT
1524f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << representation().Mnemonic() << " " << NameOf(value());
15254cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org}
15264cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
15274cd70b470729dd5850dd4120a350f01363d16837yangguo@chromium.org
1528f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HChange::PrintDataTo(OStream& os) const {  // NOLINT
1529f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  HUnaryOperation::PrintDataTo(os);
1530f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << " " << from().Mnemonic() << " to " << to().Mnemonic();
1531a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1532f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CanTruncateToSmi()) os << " truncating-smi";
1533f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CanTruncateToInt32()) os << " truncating-int32";
1534f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CheckFlag(kBailoutOnMinusZero)) os << " -0?";
1535f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CheckFlag(kAllowUndefinedAsNaN)) os << " allow-undefined-as-nan";
1536f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
1537a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1540efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgHValue* HUnaryMathOperation::Canonicalize() {
1541594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org  if (op() == kMathRound || op() == kMathFloor) {
1542ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org    HValue* val = value();
1543ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org    if (val->IsChange()) val = HChange::cast(val)->value();
1544387c3b089100ae5db9136ef045e71086f007d907danno@chromium.org    if (val->representation().IsSmiOrInteger32()) {
1545af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      if (val->representation().Equals(representation())) return val;
1546af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      return Prepend(new(block()->zone()) HChange(
1547af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org          val, representation(), false, false));
1548387c3b089100ae5db9136ef045e71086f007d907danno@chromium.org    }
1549ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org  }
15504b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  if (op() == kMathFloor && value()->IsDiv() && value()->HasOneUse()) {
1551af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    HDiv* hdiv = HDiv::cast(value());
1552af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1553af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    HValue* left = hdiv->left();
1554af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    if (left->representation().IsInteger32()) {
1555af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      // A value with an integer representation does not need to be transformed.
1556af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else if (left->IsChange() && HChange::cast(left)->from().IsInteger32()) {
1557af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      // A change from an integer32 can be replaced by the integer32 value.
1558af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      left = HChange::cast(left)->value();
1559af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else if (hdiv->observed_input_representation(1).IsSmiOrInteger32()) {
1560af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      left = Prepend(new(block()->zone()) HChange(
1561af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org          left, Representation::Integer32(), false, false));
1562af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else {
1563af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      return this;
1564af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    }
1565ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org
1566af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    HValue* right = hdiv->right();
1567af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    if (right->IsInteger32Constant()) {
1568af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      right = Prepend(HConstant::cast(right)->CopyToRepresentation(
1569af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org          Representation::Integer32(), right->block()->zone()));
1570af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else if (right->representation().IsInteger32()) {
1571af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      // A value with an integer representation does not need to be transformed.
1572af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else if (right->IsChange() &&
1573af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org               HChange::cast(right)->from().IsInteger32()) {
1574af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      // A change from an integer32 can be replaced by the integer32 value.
1575af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      right = HChange::cast(right)->value();
1576af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else if (hdiv->observed_input_representation(2).IsSmiOrInteger32()) {
1577af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      right = Prepend(new(block()->zone()) HChange(
1578af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org          right, Representation::Integer32(), false, false));
1579af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    } else {
1580af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org      return this;
1581efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    }
1582af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org
1583af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    return Prepend(HMathFloorOfDiv::New(
1584af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org        block()->zone(), context(), left, right));
1585efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
1586efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  return this;
1587efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
1588efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
1589efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
15906db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.orgHValue* HCheckInstanceType::Canonicalize() {
1591eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  if ((check_ == IS_SPEC_OBJECT && value()->type().IsJSObject()) ||
1592eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org      (check_ == IS_JS_ARRAY && value()->type().IsJSArray()) ||
1593eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org      (check_ == IS_STRING && value()->type().IsString())) {
1594d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return value();
15956db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  }
1596003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org
15974a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org  if (check_ == IS_INTERNALIZED_STRING && value()->IsConstant()) {
1598d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    if (HConstant::cast(value())->HasInternalizedStringValue()) {
1599d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return value();
1600d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
16016db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  }
16026db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org  return this;
16036db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org}
16046db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
16056db8871df97e7137d11f956af3c772f4f8370761sgjesse@chromium.org
160683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid HCheckInstanceType::GetCheckInterval(InstanceType* first,
160783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org                                          InstanceType* last) {
1608e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(is_interval_check());
160983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  switch (check_) {
1610d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org    case IS_SPEC_OBJECT:
1611d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org      *first = FIRST_SPEC_OBJECT_TYPE;
1612d2be901879306d8ff27e78e37783028d581d46fcricow@chromium.org      *last = LAST_SPEC_OBJECT_TYPE;
161383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      return;
161483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    case IS_JS_ARRAY:
161583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      *first = *last = JS_ARRAY_TYPE;
161683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      return;
161783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    default:
161883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      UNREACHABLE();
161983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
162083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org}
162183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
162283a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
162383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.orgvoid HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) {
1624e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!is_interval_check());
162583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  switch (check_) {
162683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    case IS_STRING:
162783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      *mask = kIsNotStringMask;
162883a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      *tag = kStringTag;
162983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      return;
16304a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    case IS_INTERNALIZED_STRING:
1631afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      *mask = kIsNotStringMask | kIsNotInternalizedMask;
16324a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org      *tag = kInternalizedTag;
163383a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      return;
163483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    default:
163583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org      UNREACHABLE();
163683a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
1637a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1638a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1639a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1640f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCheckMaps::PrintDataTo(OStream& os) const {  // NOLINT
1641f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(value()) << " [" << *maps()->at(0).handle();
1642af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  for (int i = 1; i < maps()->size(); ++i) {
1643f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "," << *maps()->at(i).handle();
1644af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  }
1645f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "]";
1646f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsStabilityCheck()) os << "(stability-check)";
1647f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
1648af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org}
1649af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
1650af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org
1651af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgHValue* HCheckMaps::Canonicalize() {
1652af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (!IsStabilityCheck() && maps_are_stable() && value()->IsConstant()) {
1653af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    HConstant* c_value = HConstant::cast(value());
165429699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    if (c_value->HasObjectMap()) {
1655af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org      for (int i = 0; i < maps()->size(); ++i) {
1656af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org        if (c_value->ObjectMap() == maps()->at(i)) {
1657af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org          if (maps()->size() > 1) {
1658af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org            set_maps(new(block()->graph()->zone()) UniqueSet<Map>(
1659af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org                    maps()->at(i), block()->graph()->zone()));
1660af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org          }
1661af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org          MarkAsStabilityCheck();
1662af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org          break;
1663af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org        }
1664af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org      }
1665af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    }
166678d1ad443658709d6c27809001a0e71efd8b898fyangguo@chromium.org  }
1667af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  return this;
1668a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1669a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1670a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1671f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCheckValue::PrintDataTo(OStream& os) const {  // NOLINT
1672f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value()) << " " << Brief(*object().handle());
1673a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1674a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1675a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
16761f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgHValue* HCheckValue::Canonicalize() {
1677ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  return (value()->IsConstant() &&
1678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          HConstant::cast(value())->EqualsUnique(object_)) ? NULL : this;
1679ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org}
1680ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
1681ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org
1682f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgconst char* HCheckInstanceType::GetCheckName() const {
1683c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  switch (check_) {
1684c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    case IS_SPEC_OBJECT: return "object";
1685c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    case IS_JS_ARRAY: return "array";
1686c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    case IS_STRING: return "string";
16874a9f6553038df6b893b3d3ccae351723f4cbbae7yangguo@chromium.org    case IS_INTERNALIZED_STRING: return "internalized_string";
1688c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
1689c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  UNREACHABLE();
1690c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return "";
1691c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1692c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1693e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
1694f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCheckInstanceType::PrintDataTo(OStream& os) const {  // NOLINT
1695f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << GetCheckName() << " ";
1696f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HUnaryOperation::PrintDataTo(os);
1697c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
1698c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1699c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
1700f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCallStub::PrintDataTo(OStream& os) const {  // NOLINT
1701f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << CodeStub::MajorName(major_key_, false) << " ";
1702f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HUnaryCall::PrintDataTo(os);
1703a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1704a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1705a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1706e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.orgOStream& HTailCallThroughMegamorphicCache::PrintDataTo(
1707e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    OStream& os) const {  // NOLINT
1708e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  for (int i = 0; i < OperandCount(); i++) {
1709e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org    os << NameOf(OperandAt(i)) << " ";
1710e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  }
1711e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return os << "flags: " << flags();
1712e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org}
1713e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1714e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org
1715f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HUnknownOSRValue::PrintDataTo(OStream& os) const {  // NOLINT
1716c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  const char* type = "expression";
1717c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (environment_->is_local_index(index_)) type = "local";
1718c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (environment_->is_special_index(index_)) type = "special";
1719c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org  if (environment_->is_parameter_index(index_)) type = "parameter";
1720f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << type << " @ " << index_;
1721c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org}
1722c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
1723c5d4971574b7a205fa0e788d8121dc79485e5e67hpayer@chromium.org
1724f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HInstanceOf::PrintDataTo(OStream& os) const {  // NOLINT
1725f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(left()) << " " << NameOf(right()) << " "
1726f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << NameOf(context());
1727a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1728a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1729a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1730812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HValue::InferRange(Zone* zone) {
173177ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  Range* result;
1732fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (representation().IsSmi() || type().IsSmi()) {
173377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    result = new(zone) Range(Smi::kMinValue, Smi::kMaxValue);
173477ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    result->set_can_be_minus_zero(false);
173577ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  } else {
173677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    result = new(zone) Range();
1737bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    result->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToInt32));
1738bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    // TODO(jkummerow): The range cannot be minus zero when the upper type
1739bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    // bound is Integer32.
174077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  }
17414acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org  return result;
1742a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1743a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1744a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1745812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HChange::InferRange(Zone* zone) {
1746ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  Range* input_range = value()->range();
1747fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (from().IsInteger32() && !value()->CheckFlag(HInstruction::kUint32) &&
1748fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      (to().IsSmi() ||
1749fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org       (to().IsTagged() &&
1750fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        input_range != NULL &&
1751fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        input_range->IsInSmiRange()))) {
1752ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org    set_type(HType::Smi());
1753f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    ClearChangesFlag(kNewSpacePromotion);
1754ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  }
1755381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (to().IsSmiOrTagged() &&
1756381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      input_range != NULL &&
1757381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      input_range->IsInSmiRange() &&
1758381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      (!SmiValuesAre32Bits() ||
1759381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org       !value()->CheckFlag(HValue::kUint32) ||
1760381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org       input_range->upper() != kMaxInt)) {
1761381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    // The Range class can't express upper bounds in the (kMaxInt, kMaxUint32]
1762381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    // interval, so we treat kMaxInt as a sentinel for this entire interval.
1763381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    ClearFlag(kCanOverflow);
1764381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
1765ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  Range* result = (input_range != NULL)
1766812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      ? input_range->Copy(zone)
1767812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      : HValue::InferRange(zone);
1768bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  result->set_can_be_minus_zero(!to().IsSmiOrInteger32() ||
1769fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                !(CheckFlag(kAllUsesTruncatingToInt32) ||
1770fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                  CheckFlag(kAllUsesTruncatingToSmi)));
1771fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (to().IsSmi()) result->ClampToSmi();
1772ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org  return result;
1773ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org}
1774ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
1775ddd545c4c343dcf4331b9d80d2a0bdfa373a4a0fricow@chromium.org
1776812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HConstant::InferRange(Zone* zone) {
1777a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (has_int32_value_) {
1778812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    Range* result = new(zone) Range(int32_value_, int32_value_);
1779a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    result->set_can_be_minus_zero(false);
1780a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
1781a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1782812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return HValue::InferRange(zone);
1783a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1784a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1785a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1786f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgHSourcePosition HPhi::position() const {
178771f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org  return block()->first()->position();
178871f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org}
178971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org
179071f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org
1791812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HPhi::InferRange(Zone* zone) {
17921510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  Representation r = representation();
17931510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org  if (r.IsSmiOrInteger32()) {
1794a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (block()->IsLoopHeader()) {
17951510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org      Range* range = r.IsSmi()
17961510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org          ? new(zone) Range(Smi::kMinValue, Smi::kMaxValue)
17971510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org          : new(zone) Range(kMinInt, kMaxInt);
1798a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return range;
1799a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    } else {
1800812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      Range* range = OperandAt(0)->range()->Copy(zone);
1801a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      for (int i = 1; i < OperandCount(); ++i) {
1802a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org        range->Union(OperandAt(i)->range());
1803a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
1804a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return range;
1805a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1806a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1807812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HValue::InferRange(zone);
1808a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1809a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1810a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1811a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1812812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HAdd::InferRange(Zone* zone) {
1813fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  Representation r = representation();
1814fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (r.IsSmiOrInteger32()) {
1815a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* a = left()->range();
1816a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* b = right()->range();
1817812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    Range* res = a->Copy(zone);
1818fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (!res->AddAndCheckOverflow(r, b) ||
1819fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        (r.IsInteger32() && CheckFlag(kAllUsesTruncatingToInt32)) ||
1820fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        (r.IsSmi() && CheckFlag(kAllUsesTruncatingToSmi))) {
1821a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ClearFlag(kCanOverflow);
1822a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1823fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    res->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToSmi) &&
1824fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               !CheckFlag(kAllUsesTruncatingToInt32) &&
1825bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                               a->CanBeMinusZero() && b->CanBeMinusZero());
1826a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return res;
1827a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1828812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HValue::InferRange(zone);
1829a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1830a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1831a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1832a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1833812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HSub::InferRange(Zone* zone) {
1834fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  Representation r = representation();
1835fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (r.IsSmiOrInteger32()) {
1836a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* a = left()->range();
1837a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* b = right()->range();
1838812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    Range* res = a->Copy(zone);
1839fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (!res->SubAndCheckOverflow(r, b) ||
1840fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        (r.IsInteger32() && CheckFlag(kAllUsesTruncatingToInt32)) ||
1841fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        (r.IsSmi() && CheckFlag(kAllUsesTruncatingToSmi))) {
1842a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ClearFlag(kCanOverflow);
1843a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1844fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    res->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToSmi) &&
1845fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               !CheckFlag(kAllUsesTruncatingToInt32) &&
1846bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                               a->CanBeMinusZero() && b->CanBeZero());
1847a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return res;
1848a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1849812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HValue::InferRange(zone);
1850a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1851a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1852a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1853a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1854812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HMul::InferRange(Zone* zone) {
1855fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  Representation r = representation();
1856fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (r.IsSmiOrInteger32()) {
1857a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* a = left()->range();
1858a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* b = right()->range();
1859812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    Range* res = a->Copy(zone);
18608e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org    if (!res->MulAndCheckOverflow(r, b) ||
18618e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org        (((r.IsInteger32() && CheckFlag(kAllUsesTruncatingToInt32)) ||
18628e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org         (r.IsSmi() && CheckFlag(kAllUsesTruncatingToSmi))) &&
18638e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org         MulMinusOne())) {
18648e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org      // Truncated int multiplication is too precise and therefore not the
18658e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org      // same as converting to Double and back.
18668e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org      // Handle truncated integer multiplication by -1 special.
1867a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ClearFlag(kCanOverflow);
1868a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1869fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    res->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToSmi) &&
1870fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                               !CheckFlag(kAllUsesTruncatingToInt32) &&
1871bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                               ((a->CanBeZero() && b->CanBeNegative()) ||
1872bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                                (a->CanBeNegative() && b->CanBeZero())));
1873a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return res;
1874a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1875812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HValue::InferRange(zone);
1876a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1877a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1878a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1879a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1880381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgRange* HDiv::InferRange(Zone* zone) {
1881a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (representation().IsInteger32()) {
1882906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    Range* a = left()->range();
1883906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    Range* b = right()->range();
1884812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    Range* result = new(zone) Range();
1885bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    result->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToInt32) &&
1886bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                                  (a->CanBeMinusZero() ||
1887bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                                   (a->CanBeZero() && b->CanBeNegative())));
1888afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    if (!a->Includes(kMinInt) || !b->Includes(-1)) {
1889486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      ClearFlag(kCanOverflow);
1890a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1891a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1892906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (!b->CanBeZero()) {
1893486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org      ClearFlag(kCanBeDivByZero);
1894a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1895a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
1896a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1897812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HValue::InferRange(zone);
1898a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1899a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1900a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1901a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1902381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.orgRange* HMathFloorOfDiv::InferRange(Zone* zone) {
1903381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  if (representation().IsInteger32()) {
1904381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Range* a = left()->range();
1905381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Range* b = right()->range();
1906381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    Range* result = new(zone) Range();
1907381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    result->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToInt32) &&
1908381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org                                  (a->CanBeMinusZero() ||
1909381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org                                   (a->CanBeZero() && b->CanBeNegative())));
1910381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    if (!a->Includes(kMinInt)) {
1911381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      ClearFlag(kLeftCanBeMinInt);
1912381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    }
1913486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
19147010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    if (!a->CanBeNegative()) {
19157010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      ClearFlag(HValue::kLeftCanBeNegative);
19167010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    }
19177010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org
19187010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    if (!a->CanBePositive()) {
19197010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org      ClearFlag(HValue::kLeftCanBePositive);
19207010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org    }
19217010a2d84de67daace72568ffcde315a3e510ab5machenbach@chromium.org
1922381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    if (!a->Includes(kMinInt) || !b->Includes(-1)) {
1923381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      ClearFlag(kCanOverflow);
1924381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    }
1925486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
1926381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    if (!b->CanBeZero()) {
1927381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      ClearFlag(kCanBeDivByZero);
1928381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    }
1929381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return result;
1930381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  } else {
1931381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    return HValue::InferRange(zone);
1932381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org  }
1933486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org}
1934486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
1935486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org
1936fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.org// Returns the absolute value of its argument minus one, avoiding undefined
1937fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.org// behavior at kMinInt.
1938fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.orgstatic int32_t AbsMinus1(int32_t a) { return a < 0 ? -(a + 1) : (a - 1); }
1939fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.org
1940fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.org
1941812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HMod::InferRange(Zone* zone) {
1942a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (representation().IsInteger32()) {
1943a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    Range* a = left()->range();
1944906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    Range* b = right()->range();
1945b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1946fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.org    // The magnitude of the modulus is bounded by the right operand.
1947fda8f0c912147597a3060a3d80f557840635ca01machenbach@chromium.org    int32_t positive_bound = Max(AbsMinus1(b->lower()), AbsMinus1(b->upper()));
1948b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1949b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    // The result of the modulo operation has the sign of its left operand.
1950b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    bool left_can_be_negative = a->CanBeMinusZero() || a->CanBeNegative();
1951b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    Range* result = new(zone) Range(left_can_be_negative ? -positive_bound : 0,
1952b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org                                    a->CanBePositive() ? positive_bound : 0);
1953b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org
1954bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    result->set_can_be_minus_zero(!CheckFlag(kAllUsesTruncatingToInt32) &&
1955bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org                                  left_can_be_negative);
1956a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1957381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    if (!a->CanBeNegative()) {
1958381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org      ClearFlag(HValue::kLeftCanBeNegative);
1959381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org    }
1960381adef828187e237e8758ab730dee1c2834a0b3machenbach@chromium.org
1961906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (!a->Includes(kMinInt) || !b->Includes(-1)) {
1962906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org      ClearFlag(HValue::kCanOverflow);
1963a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org    }
1964a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
1965906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (!b->CanBeZero()) {
1966a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      ClearFlag(HValue::kCanBeDivByZero);
1967a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
1968a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    return result;
1969a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  } else {
1970812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org    return HValue::InferRange(zone);
1971a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
1972a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
1973a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1974a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
1975fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgInductionVariableData* InductionVariableData::ExaminePhi(HPhi* phi) {
1976fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (phi->block()->loop_information() == NULL) return NULL;
1977fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (phi->OperandCount() != 2) return NULL;
1978fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int32_t candidate_increment;
1979fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1980fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  candidate_increment = ComputeIncrement(phi, phi->OperandAt(0));
1981fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (candidate_increment != 0) {
1982fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return new(phi->block()->graph()->zone())
1983fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        InductionVariableData(phi, phi->OperandAt(1), candidate_increment);
1984fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
1985fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1986fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  candidate_increment = ComputeIncrement(phi, phi->OperandAt(1));
1987fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (candidate_increment != 0) {
1988fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return new(phi->block()->graph()->zone())
1989fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        InductionVariableData(phi, phi->OperandAt(0), candidate_increment);
1990fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
1991fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1992fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return NULL;
1993fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
1994fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1995fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
1996fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org/*
1997fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * This function tries to match the following patterns (and all the relevant
1998fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * variants related to |, & and + being commutative):
1999fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * base | constant_or_mask
2000fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * base & constant_and_mask
2001fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * (base + constant_offset) & constant_and_mask
2002fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * (base - constant_offset) & constant_and_mask
2003fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org */
2004fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::DecomposeBitwise(
2005fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HValue* value,
2006fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    BitwiseDecompositionResult* result) {
2007fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HValue* base = IgnoreOsrValue(value);
2008fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result->base = value;
2009fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2010fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!base->representation().IsInteger32()) return;
2011fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2012fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (base->IsBitwise()) {
2013fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    bool allow_offset = false;
2014fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    int32_t mask = 0;
2015fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2016fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBitwise* bitwise = HBitwise::cast(base);
2017fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (bitwise->right()->IsInteger32Constant()) {
2018fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      mask = bitwise->right()->GetInteger32Constant();
2019fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      base = bitwise->left();
2020fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    } else if (bitwise->left()->IsInteger32Constant()) {
2021fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      mask = bitwise->left()->GetInteger32Constant();
2022fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      base = bitwise->right();
2023fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    } else {
2024fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return;
2025fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2026fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (bitwise->op() == Token::BIT_AND) {
2027fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      result->and_mask = mask;
2028fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      allow_offset = true;
2029fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    } else if (bitwise->op() == Token::BIT_OR) {
2030fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      result->or_mask = mask;
2031fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    } else {
2032fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return;
2033fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2034fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2035fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result->context = bitwise->context();
2036fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2037fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (allow_offset) {
2038fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if (base->IsAdd()) {
2039fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        HAdd* add = HAdd::cast(base);
2040fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        if (add->right()->IsInteger32Constant()) {
2041fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          base = add->left();
2042fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        } else if (add->left()->IsInteger32Constant()) {
2043fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          base = add->right();
2044fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        }
2045fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      } else if (base->IsSub()) {
2046fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        HSub* sub = HSub::cast(base);
2047fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        if (sub->right()->IsInteger32Constant()) {
2048fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          base = sub->left();
2049fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        }
2050fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      }
2051fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2052fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2053fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result->base = base;
2054fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2055fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2056fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2057fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2058fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::AddCheck(HBoundsCheck* check,
2059fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                     int32_t upper_limit) {
2060e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(limit_validity() != NULL);
2061fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (limit_validity() != check->block() &&
2062fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      !limit_validity()->Dominates(check->block())) return;
2063fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!phi()->block()->current_loop()->IsNestedInThisLoop(
2064fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      check->block()->current_loop())) return;
2065fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2066fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ChecksRelatedToLength* length_checks = checks();
2067fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  while (length_checks != NULL) {
2068fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (length_checks->length() == check->length()) break;
2069fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    length_checks = length_checks->next();
2070fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2071fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (length_checks == NULL) {
2072fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    length_checks = new(check->block()->zone())
2073fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        ChecksRelatedToLength(check->length(), checks());
2074fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    checks_ = length_checks;
2075fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2076fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2077fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  length_checks->AddCheck(check, upper_limit);
2078fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2079fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2080fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2081fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::ChecksRelatedToLength::CloseCurrentBlock() {
2082fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (checks() != NULL) {
2083fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    InductionVariableCheck* c = checks();
2084fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBasicBlock* current_block = c->check()->block();
2085fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    while (c != NULL && c->check()->block() == current_block) {
2086fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      c->set_upper_limit(current_upper_limit_);
2087fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      c = c->next();
2088fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2089fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2090fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2091fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2092fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2093fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::ChecksRelatedToLength::UseNewIndexInCurrentBlock(
2094fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    Token::Value token,
2095fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    int32_t mask,
2096fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HValue* index_base,
2097fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HValue* context) {
2098e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(first_check_in_block() != NULL);
2099fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HValue* previous_index = first_check_in_block()->index();
2100e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(context != NULL);
2101fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2102d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Zone* zone = index_base->block()->graph()->zone();
2103d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  set_added_constant(HConstant::New(zone, context, mask));
2104fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (added_index() != NULL) {
2105fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    added_constant()->InsertBefore(added_index());
2106fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
2107fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    added_constant()->InsertBefore(first_check_in_block());
2108fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2109fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2110fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (added_index() == NULL) {
2111fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    first_check_in_block()->ReplaceAllUsesWith(first_check_in_block()->index());
2112d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    HInstruction* new_index =  HBitwise::New(zone, context, token, index_base,
2113d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                             added_constant());
2114e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(new_index->IsBitwise());
2115fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    new_index->ClearAllSideEffects();
2116fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    new_index->AssumeRepresentation(Representation::Integer32());
2117fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    set_added_index(HBitwise::cast(new_index));
2118fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    added_index()->InsertBefore(first_check_in_block());
2119fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2120e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(added_index()->op() == token);
2121fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2122fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  added_index()->SetOperandAt(1, index_base);
2123fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  added_index()->SetOperandAt(2, added_constant());
2124fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  first_check_in_block()->SetOperandAt(0, added_index());
21254b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  if (previous_index->HasNoUses()) {
2126fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    previous_index->DeleteAndReplaceWith(NULL);
2127fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2128fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2129fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2130fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::ChecksRelatedToLength::AddCheck(
2131fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBoundsCheck* check,
2132fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    int32_t upper_limit) {
2133fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  BitwiseDecompositionResult decomposition;
2134fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  InductionVariableData::DecomposeBitwise(check->index(), &decomposition);
2135fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2136fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (first_check_in_block() == NULL ||
2137fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      first_check_in_block()->block() != check->block()) {
2138fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    CloseCurrentBlock();
2139fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2140fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    first_check_in_block_ = check;
2141fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    set_added_index(NULL);
2142fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    set_added_constant(NULL);
2143fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    current_and_mask_in_block_ = decomposition.and_mask;
2144fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    current_or_mask_in_block_ = decomposition.or_mask;
2145fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    current_upper_limit_ = upper_limit;
2146fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2147fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    InductionVariableCheck* new_check = new(check->block()->graph()->zone())
2148fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        InductionVariableCheck(check, checks_, upper_limit);
2149fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    checks_ = new_check;
2150fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return;
2151fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2152fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2153fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (upper_limit > current_upper_limit()) {
2154fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    current_upper_limit_ = upper_limit;
2155fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2156fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2157fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (decomposition.and_mask != 0 &&
2158fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      current_or_mask_in_block() == 0) {
2159fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (current_and_mask_in_block() == 0 ||
2160fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        decomposition.and_mask > current_and_mask_in_block()) {
2161fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      UseNewIndexInCurrentBlock(Token::BIT_AND,
2162fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                decomposition.and_mask,
2163fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                decomposition.base,
2164fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                decomposition.context);
2165fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      current_and_mask_in_block_ = decomposition.and_mask;
2166fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2167fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    check->set_skip_check();
2168fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2169fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (current_and_mask_in_block() == 0) {
2170fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (decomposition.or_mask > current_or_mask_in_block()) {
2171fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      UseNewIndexInCurrentBlock(Token::BIT_OR,
2172fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                decomposition.or_mask,
2173fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                decomposition.base,
2174fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                decomposition.context);
2175fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      current_or_mask_in_block_ = decomposition.or_mask;
2176fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2177fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    check->set_skip_check();
2178fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2179fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2180fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!check->skip_check()) {
2181fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    InductionVariableCheck* new_check = new(check->block()->graph()->zone())
2182fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        InductionVariableCheck(check, checks_, upper_limit);
2183fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    checks_ = new_check;
2184fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2185fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2186fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2187fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2188fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org/*
2189fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * This method detects if phi is an induction variable, with phi_operand as
2190fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * its "incremented" value (the other operand would be the "base" value).
2191fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org *
2192fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * It cheks is phi_operand has the form "phi + constant".
2193fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * If yes, the constant is the increment that the induction variable gets at
2194fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * every loop iteration.
2195fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * Otherwise it returns 0.
2196fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org */
2197fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgint32_t InductionVariableData::ComputeIncrement(HPhi* phi,
2198fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                                HValue* phi_operand) {
2199fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!phi_operand->representation().IsInteger32()) return 0;
2200fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2201fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (phi_operand->IsAdd()) {
2202fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HAdd* operation = HAdd::cast(phi_operand);
2203fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (operation->left() == phi &&
2204fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        operation->right()->IsInteger32Constant()) {
2205fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return operation->right()->GetInteger32Constant();
2206fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    } else if (operation->right() == phi &&
2207fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org               operation->left()->IsInteger32Constant()) {
2208fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return operation->left()->GetInteger32Constant();
2209fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2210fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else if (phi_operand->IsSub()) {
2211fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HSub* operation = HSub::cast(phi_operand);
2212fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (operation->left() == phi &&
2213fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        operation->right()->IsInteger32Constant()) {
2214fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return -operation->right()->GetInteger32Constant();
2215fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2216fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2217fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2218fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return 0;
2219fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2220fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2221fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2222fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org/*
2223fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * Swaps the information in "update" with the one contained in "this".
2224fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * The swapping is important because this method is used while doing a
2225fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * dominator tree traversal, and "update" will retain the old data that
2226fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * will be restored while backtracking.
2227fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org */
2228fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::UpdateAdditionalLimit(
2229fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    InductionVariableLimitUpdate* update) {
2230e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(update->updated_variable == this);
2231fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (update->limit_is_upper) {
2232fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    swap(&additional_upper_limit_, &update->limit);
2233fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    swap(&additional_upper_limit_is_included_, &update->limit_is_included);
2234fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
2235fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    swap(&additional_lower_limit_, &update->limit);
2236fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    swap(&additional_lower_limit_is_included_, &update->limit_is_included);
2237fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2238fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2239fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2240fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2241fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgint32_t InductionVariableData::ComputeUpperLimit(int32_t and_mask,
2242fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                                 int32_t or_mask) {
2243fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // Should be Smi::kMaxValue but it must fit 32 bits; lower is safe anyway.
2244fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  const int32_t MAX_LIMIT = 1 << 30;
2245fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2246fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  int32_t result = MAX_LIMIT;
2247fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2248fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (limit() != NULL &&
2249fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      limit()->IsInteger32Constant()) {
2250fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    int32_t limit_value = limit()->GetInteger32Constant();
2251fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (!limit_included()) {
2252fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      limit_value--;
2253fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2254fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (limit_value < result) result = limit_value;
2255fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2256fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2257fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (additional_upper_limit() != NULL &&
2258fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      additional_upper_limit()->IsInteger32Constant()) {
2259fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    int32_t limit_value = additional_upper_limit()->GetInteger32Constant();
2260fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (!additional_upper_limit_is_included()) {
2261fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      limit_value--;
2262fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    }
2263fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (limit_value < result) result = limit_value;
2264fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2265fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2266fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (and_mask > 0 && and_mask < MAX_LIMIT) {
2267fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (and_mask < result) result = and_mask;
2268fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return result;
2269fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2270fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2271fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  // Add the effect of the or_mask.
2272fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  result |= or_mask;
2273fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2274fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return result >= MAX_LIMIT ? kNoLimit : result;
2275fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2276fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2277fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2278fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgHValue* InductionVariableData::IgnoreOsrValue(HValue* v) {
2279fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!v->IsPhi()) return v;
2280fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HPhi* phi = HPhi::cast(v);
2281fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (phi->OperandCount() != 2) return v;
2282fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (phi->OperandAt(0)->block()->is_osr_entry()) {
2283fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return phi->OperandAt(1);
2284fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else if (phi->OperandAt(1)->block()->is_osr_entry()) {
2285fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return phi->OperandAt(0);
2286fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
2287fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return v;
2288fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2289fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2290fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2291fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2292fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgInductionVariableData* InductionVariableData::GetInductionVariableData(
2293fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HValue* v) {
2294fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  v = IgnoreOsrValue(v);
2295fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (v->IsPhi()) {
2296fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return HPhi::cast(v)->induction_variable_data();
2297fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2298fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return NULL;
2299fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2300fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2301fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2302fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org/*
2303fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * Check if a conditional branch to "current_branch" with token "token" is
2304fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * the branch that keeps the induction loop running (and, conversely, will
2305fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * terminate it if the "other_branch" is taken).
2306fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org *
2307fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * Three conditions must be met:
2308fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * - "current_branch" must be in the induction loop.
2309fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * - "other_branch" must be out of the induction loop.
2310fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * - "token" and the induction increment must be "compatible": the token should
2311fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org *   be a condition that keeps the execution inside the loop until the limit is
2312fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org *   reached.
2313fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org */
2314fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool InductionVariableData::CheckIfBranchIsLoopGuard(
2315fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    Token::Value token,
2316fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBasicBlock* current_branch,
2317fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBasicBlock* other_branch) {
2318fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!phi()->block()->current_loop()->IsNestedInThisLoop(
2319fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      current_branch->current_loop())) {
2320fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return false;
2321fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2322fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2323fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (phi()->block()->current_loop()->IsNestedInThisLoop(
2324fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      other_branch->current_loop())) {
2325fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return false;
2326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2327fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2328fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (increment() > 0 && (token == Token::LT || token == Token::LTE)) {
2329fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return true;
2330fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2331fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (increment() < 0 && (token == Token::GT || token == Token::GTE)) {
2332fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return true;
2333fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2334fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (Token::IsInequalityOp(token) && (increment() == 1 || increment() == -1)) {
2335fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return true;
2336fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2337fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2338fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return false;
2339fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2340fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2341fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2342fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgvoid InductionVariableData::ComputeLimitFromPredecessorBlock(
2343fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBasicBlock* block,
2344fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    LimitFromPredecessorBlock* result) {
2345fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (block->predecessors()->length() != 1) return;
2346fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HBasicBlock* predecessor = block->predecessors()->at(0);
2347fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HInstruction* end = predecessor->last();
2348fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2349fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!end->IsCompareNumericAndBranch()) return;
2350fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HCompareNumericAndBranch* branch = HCompareNumericAndBranch::cast(end);
2351fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2352fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  Token::Value token = branch->token();
2353fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!Token::IsArithmeticCompareOp(token)) return;
2354fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2355fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HBasicBlock* other_target;
2356fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (block == branch->SuccessorAt(0)) {
2357fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    other_target = branch->SuccessorAt(1);
2358fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
2359fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    other_target = branch->SuccessorAt(0);
2360fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    token = Token::NegateCompareOp(token);
2361e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(block == branch->SuccessorAt(1));
2362fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2363fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2364fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  InductionVariableData* data;
2365fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2366fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  data = GetInductionVariableData(branch->left());
2367fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  HValue* limit = branch->right();
2368fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (data == NULL) {
2369fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    data = GetInductionVariableData(branch->right());
2370fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    token = Token::ReverseCompareOp(token);
2371fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    limit = branch->left();
2372fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2373fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2374fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (data != NULL) {
2375fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result->variable = data;
2376fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result->token = token;
2377fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result->limit = limit;
2378fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    result->other_target = other_target;
2379fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2380fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2381fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2382fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2383fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org/*
2384fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * Compute the limit that is imposed on an induction variable when entering
2385fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * "block" (if any).
2386fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * If the limit is the "proper" induction limit (the one that makes the loop
2387fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * terminate when the induction variable reaches it) it is stored directly in
2388fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * the induction variable data.
2389fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * Otherwise the limit is written in "additional_limit" and the method
2390fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org * returns true.
2391fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org */
2392fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool InductionVariableData::ComputeInductionVariableLimit(
2393fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    HBasicBlock* block,
2394fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    InductionVariableLimitUpdate* additional_limit) {
2395fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  LimitFromPredecessorBlock limit;
2396fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  ComputeLimitFromPredecessorBlock(block, &limit);
2397fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!limit.LimitIsValid()) return false;
2398fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2399fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (limit.variable->CheckIfBranchIsLoopGuard(limit.token,
2400fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                               block,
2401fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org                                               limit.other_target)) {
2402fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    limit.variable->limit_ = limit.limit;
2403fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    limit.variable->limit_included_ = limit.LimitIsIncluded();
2404fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    limit.variable->limit_validity_ = block;
2405fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    limit.variable->induction_exit_block_ = block->predecessors()->at(0);
2406fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    limit.variable->induction_exit_target_ = limit.other_target;
2407fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return false;
2408fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
2409fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    additional_limit->updated_variable = limit.variable;
2410fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    additional_limit->limit = limit.limit;
2411fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    additional_limit->limit_is_upper = limit.LimitIsUpper();
2412fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    additional_limit->limit_is_included = limit.LimitIsIncluded();
2413fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return true;
2414fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
2415fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
2416fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2417fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
2418471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.orgRange* HMathMinMax::InferRange(Zone* zone) {
2419fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (representation().IsSmiOrInteger32()) {
2420471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Range* a = left()->range();
2421471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Range* b = right()->range();
2422471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    Range* res = a->Copy(zone);
2423471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    if (operation_ == kMathMax) {
2424471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      res->CombinedMax(b);
2425471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    } else {
2426e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK(operation_ == kMathMin);
2427471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org      res->CombinedMin(b);
2428471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    }
2429471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    return res;
2430471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  } else {
2431471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org    return HValue::InferRange(zone);
2432471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org  }
2433471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org}
2434471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
2435471f2f1d24adb4bad1edc3bf0ee35092486de187mstarzinger@chromium.org
24368d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.orgvoid HPushArguments::AddInput(HValue* value) {
24378d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  inputs_.Add(NULL, value->block()->zone());
24388d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  SetOperandAt(OperandCount() - 1, value);
24398d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org}
24408d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
24418d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org
2442f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HPhi::PrintTo(OStream& os) const {  // NOLINT
2443f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "[";
2444a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
2445f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << " " << NameOf(OperandAt(i)) << " ";
2446a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2447f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << " uses:" << UseCount() << "_"
2448f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << smi_non_phi_uses() + smi_indirect_uses() << "s_"
2449f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << int32_non_phi_uses() + int32_indirect_uses() << "i_"
2450f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << double_non_phi_uses() + double_indirect_uses() << "d_"
2451f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << tagged_non_phi_uses() + tagged_indirect_uses() << "t"
2452f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << TypeOf(this) << "]";
2453a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2454a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2455a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2456a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HPhi::AddInput(HValue* value) {
24577028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  inputs_.Add(NULL, value->block()->zone());
2458a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  SetOperandAt(OperandCount() - 1, value);
2459a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Mark phis that may have 'arguments' directly or indirectly as an operand.
2460a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (!CheckFlag(kIsArguments) && value->CheckFlag(kIsArguments)) {
2461a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    SetFlag(kIsArguments);
2462a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2463a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2464a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2465a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
24664d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.orgbool HPhi::HasRealUses() {
24673847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
24683847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    if (!it.value()->IsPhi()) return true;
24694d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  }
24704d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org  return false;
24714d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org}
24724d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
24734d3fe4e246b0312eba361689f288ddf8dd516960danno@chromium.org
24743a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgHValue* HPhi::GetRedundantReplacement() {
2475a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HValue* candidate = NULL;
2476a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int count = OperandCount();
2477a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  int position = 0;
2478a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (position < count && candidate == NULL) {
2479a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HValue* current = OperandAt(position++);
2480a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (current != this) candidate = current;
2481a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2482a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  while (position < count) {
2483a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HValue* current = OperandAt(position++);
2484a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (current != this && current != candidate) return NULL;
2485a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2486e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(candidate != this);
2487a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return candidate;
2488a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2489a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2490a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2491a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HPhi::DeleteFromGraph() {
2492e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(block() != NULL);
2493a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  block()->RemovePhi(this);
2494e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(block() == NULL);
2495a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2496a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2497a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2498a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HPhi::InitRealUses(int phi_id) {
2499a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  // Initialize real uses.
2500a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  phi_id_ = phi_id;
250157ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // Compute a conservative approximation of truncating uses before inferring
250257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // representations. The proper, exact computation will be done later, when
250357ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  // inserting representation changes.
2504fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  SetFlag(kTruncatingToSmi);
250557ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  SetFlag(kTruncatingToInt32);
25063847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
25073847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    HValue* value = it.value();
25083847bd5ff857259e945a01d75fdb383e2351d166erik.corry@gmail.com    if (!value->IsPhi()) {
2509fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      Representation rep = value->observed_input_representation(it.index());
2510e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org      non_phi_uses_[rep.kind()] += 1;
25117028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      if (FLAG_trace_representation) {
2512fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org        PrintF("#%d Phi is used by real #%d %s as %s\n",
2513fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org               id(), value->id(), value->Mnemonic(), rep.Mnemonic());
25147028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org      }
2515fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      if (!value->IsSimulate()) {
2516fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        if (!value->CheckFlag(kTruncatingToSmi)) {
2517fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          ClearFlag(kTruncatingToSmi);
2518fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        }
2519fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        if (!value->CheckFlag(kTruncatingToInt32)) {
2520fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          ClearFlag(kTruncatingToInt32);
2521fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        }
252257ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org      }
2523a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
2524a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2525a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2526a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2527a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2528a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HPhi::AddNonPhiUsesFrom(HPhi* other) {
25297028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  if (FLAG_trace_representation) {
2530a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    PrintF("adding to #%d Phi uses of #%d Phi: s%d i%d d%d t%d\n",
2531fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org           id(), other->id(),
2532a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org           other->non_phi_uses_[Representation::kSmi],
25337028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org           other->non_phi_uses_[Representation::kInteger32],
25347028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org           other->non_phi_uses_[Representation::kDouble],
25357028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org           other->non_phi_uses_[Representation::kTagged]);
25367028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  }
25377028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < Representation::kNumRepresentations; i++) {
2539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    indirect_uses_[i] += other->non_phi_uses_[i];
2540a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2541a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.orgvoid HPhi::AddIndirectUsesTo(int* dest) {
2545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < Representation::kNumRepresentations; i++) {
2546a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    dest[i] += indirect_uses_[i];
2547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2548a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2551e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.orgvoid HSimulate::MergeWith(ZoneList<HSimulate*>* list) {
2552e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  while (!list->is_empty()) {
2553e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    HSimulate* from = list->RemoveLast();
2554e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    ZoneList<HValue*>* from_values = &from->values_;
2555e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    for (int i = 0; i < from_values->length(); ++i) {
2556e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org      if (from->HasAssignedIndexAt(i)) {
2557a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        int index = from->GetAssignedIndexAt(i);
2558a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        if (HasValueForIndex(index)) continue;
2559a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org        AddAssignedValue(index, from_values->at(i));
2560fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      } else {
2561e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        if (pop_count_ > 0) {
2562e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org          pop_count_--;
2563e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        } else {
2564e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org          AddPushedValue(from_values->at(i));
2565e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org        }
2566fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      }
2567fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
2568e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    pop_count_ += from->pop_count_;
2569e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org    from->DeleteAndReplaceWith(NULL);
2570fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
25717028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org}
25727028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
25737028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org
2574f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HSimulate::PrintDataTo(OStream& os) const {  // NOLINT
2575f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "id=" << ast_id().ToInt();
2576f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (pop_count_ > 0) os << " pop " << pop_count_;
2577a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (values_.length() > 0) {
2578f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (pop_count_ > 0) os << " /";
2579fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    for (int i = values_.length() - 1; i >= 0; --i) {
2580394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      if (HasAssignedIndexAt(i)) {
2581f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        os << " var[" << GetAssignedIndexAt(i) << "] = ";
2582394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com      } else {
2583f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        os << " push ";
2584a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      }
2585f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << NameOf(values_[i]);
2586f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (i > 0) os << ",";
2587a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
2588a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2589f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
2590a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2591a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2592a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2593662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid HSimulate::ReplayEnvironment(HEnvironment* env) {
2594486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  if (done_with_replay_) return;
2595e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(env != NULL);
2596662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  env->set_ast_id(ast_id());
2597662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  env->Drop(pop_count());
2598662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  for (int i = values()->length() - 1; i >= 0; --i) {
2599662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    HValue* value = values()->at(i);
2600662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    if (HasAssignedIndexAt(i)) {
2601662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      env->Bind(GetAssignedIndexAt(i), value);
2602662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    } else {
2603662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org      env->Push(value);
2604662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    }
2605662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  }
2606486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org  done_with_replay_ = true;
2607662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
2608662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
2609662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
2610cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.orgstatic void ReplayEnvironmentNested(const ZoneList<HValue*>* values,
2611cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org                                    HCapturedObject* other) {
2612cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  for (int i = 0; i < values->length(); ++i) {
2613cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    HValue* value = values->at(i);
2614cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    if (value->IsCapturedObject()) {
2615cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org      if (HCapturedObject::cast(value)->capture_id() == other->capture_id()) {
2616cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org        values->at(i) = other;
2617cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org      } else {
2618cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org        ReplayEnvironmentNested(HCapturedObject::cast(value)->values(), other);
2619cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org      }
2620cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    }
2621cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org  }
2622cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org}
2623cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
2624cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org
26251e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// Replay captured objects by replacing all captured objects with the
26261e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org// same capture id in the current and all outer environments.
26271e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.orgvoid HCapturedObject::ReplayEnvironment(HEnvironment* env) {
2628e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(env != NULL);
26291e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  while (env != NULL) {
2630cfdf67d672b8e2cd6cc1df14c082671511745746machenbach@chromium.org    ReplayEnvironmentNested(env->values(), this);
26311e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org    env = env->outer();
26321e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org  }
26331e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org}
26341e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
26351e8da746019f818a22dfdc6f691dbc0447048cadjkummerow@chromium.org
2636f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCapturedObject::PrintDataTo(OStream& os) const {  // NOLINT
2637f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "#" << capture_id() << " ";
2638f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HDematerializedObject::PrintDataTo(os);
26392ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org}
26402ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org
26412ed0d029906d9c6f0ae06fe8eb7f1180077ae2b0mstarzinger@chromium.org
2642d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgvoid HEnterInlined::RegisterReturnTarget(HBasicBlock* return_target,
2643d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                                         Zone* zone) {
2644e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(return_target->IsInlineReturnTarget());
2645d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return_targets_.Add(return_target, zone);
2646d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org}
2647d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
2648d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
2649f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HEnterInlined::PrintDataTo(OStream& os) const {  // NOLINT
2650f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << function()->debug_name()->ToCString().get()
2651f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << ", id=" << function()->id().ToInt();
2652a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2653a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2654a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2655657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.orgstatic bool IsInteger32(double value) {
2656657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  double roundtrip_value = static_cast<double>(static_cast<int32_t>(value));
2657e20e19efeef112c26d0e63b1e5118e695b42d855machenbach@chromium.org  return bit_cast<int64_t>(roundtrip_value) == bit_cast<int64_t>(value);
2658657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org}
2659657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
2660657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
2661af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.orgHConstant::HConstant(Handle<Object> object, Representation r)
2662eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  : HTemplateInstruction<0>(HType::FromValue(object)),
2663af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    object_(Unique<Object>::CreateUninitialized(object)),
2664af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    object_map_(Handle<Map>::null()),
266529699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    has_stable_map_value_(false),
266653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    has_smi_value_(false),
26672bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    has_int32_value_(false),
26682bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org    has_double_value_(false),
2669d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_external_reference_value_(false),
2670f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org    is_not_in_new_space_(true),
2671af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    boolean_value_(object->BooleanValue()),
2672bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    is_undetectable_(false),
2673bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    instance_type_(kUnknownInstanceType) {
2674af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (object->IsHeapObject()) {
267529699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    Handle<HeapObject> heap_object = Handle<HeapObject>::cast(object);
267629699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    Isolate* isolate = heap_object->GetIsolate();
267729699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    Handle<Map> map(heap_object->map(), isolate);
2678af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    is_not_in_new_space_ = !isolate->heap()->InNewSpace(*object);
2679af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    instance_type_ = map->instance_type();
2680af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    is_undetectable_ = map->is_undetectable();
268129699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    if (map->is_stable()) object_map_ = Unique<Map>::CreateImmovable(map);
268229699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    has_stable_map_value_ = (instance_type_ == MAP_TYPE &&
268329699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org                             Handle<Map>::cast(heap_object)->is_stable());
2684af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  }
2685af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  if (object->IsNumber()) {
2686af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    double n = object->Number();
2687657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    has_int32_value_ = IsInteger32(n);
2688657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org    int32_value_ = DoubleToInt32(n);
268953ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
2690a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    double_value_ = n;
2691a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    has_double_value_ = true;
2692c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org    // TODO(titzer): if this heap number is new space, tenure a new one.
2693a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
2694e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
26958432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  Initialize(r);
2696a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2697a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2698a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
269929699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.orgHConstant::HConstant(Unique<Object> object,
270029699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org                     Unique<Map> object_map,
270129699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org                     bool has_stable_map_value,
27022bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                     Representation r,
27032bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                     HType type,
2704f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                     bool is_not_in_new_space,
2705bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                     bool boolean_value,
2706bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                     bool is_undetectable,
2707bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                     InstanceType instance_type)
2708d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  : HTemplateInstruction<0>(type),
270929699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    object_(object),
271029699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    object_map_(object_map),
271129699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    has_stable_map_value_(has_stable_map_value),
2712d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_smi_value_(false),
2713d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_int32_value_(false),
2714d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_double_value_(false),
2715d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_external_reference_value_(false),
2716d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    is_not_in_new_space_(is_not_in_new_space),
2717bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    boolean_value_(boolean_value),
2718bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    is_undetectable_(is_undetectable),
2719bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    instance_type_(instance_type) {
2720e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!object.handle().is_null());
2721e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!type.IsTaggedNumber() || type.IsNone());
27222bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org  Initialize(r);
27232bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org}
27242bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
27252bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
27262bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgHConstant::HConstant(int32_t integer_value,
27272bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                     Representation r,
2728f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                     bool is_not_in_new_space,
27293d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org                     Unique<Object> object)
27303d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  : object_(object),
2731af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    object_map_(Handle<Map>::null()),
273229699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    has_stable_map_value_(false),
2733d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_smi_value_(Smi::IsValid(integer_value)),
2734d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_int32_value_(true),
2735d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_double_value_(true),
2736d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_external_reference_value_(false),
2737d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    is_not_in_new_space_(is_not_in_new_space),
2738d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    boolean_value_(integer_value != 0),
2739bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    is_undetectable_(false),
2740d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    int32_value_(integer_value),
2741bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    double_value_(FastI2D(integer_value)),
2742bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    instance_type_(kUnknownInstanceType) {
274350bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  // It's possible to create a constant with a value in Smi-range but stored
274450bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  // in a (pre-existing) HeapNumber. See crbug.com/349878.
274550bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  bool could_be_heapobject = r.IsTagged() && !object.handle().is_null();
274650bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  bool is_smi = has_smi_value_ && !could_be_heapobject;
274750bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  set_type(is_smi ? HType::Smi() : HType::TaggedNumber());
27488432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  Initialize(r);
2749657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org}
2750657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
2751657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
27522bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.orgHConstant::HConstant(double double_value,
27532bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org                     Representation r,
2754f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                     bool is_not_in_new_space,
27553d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org                     Unique<Object> object)
27563d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  : object_(object),
2757af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    object_map_(Handle<Map>::null()),
275829699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    has_stable_map_value_(false),
2759d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_int32_value_(IsInteger32(double_value)),
2760d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_double_value_(true),
2761d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_external_reference_value_(false),
2762d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    is_not_in_new_space_(is_not_in_new_space),
2763d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    boolean_value_(double_value != 0 && !std::isnan(double_value)),
2764bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    is_undetectable_(false),
2765d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    int32_value_(DoubleToInt32(double_value)),
2766bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    double_value_(double_value),
2767bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    instance_type_(kUnknownInstanceType) {
276853ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  has_smi_value_ = has_int32_value_ && Smi::IsValid(int32_value_);
276950bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  // It's possible to create a constant with a value in Smi-range but stored
277050bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  // in a (pre-existing) HeapNumber. See crbug.com/349878.
277150bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  bool could_be_heapobject = r.IsTagged() && !object.handle().is_null();
277250bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  bool is_smi = has_smi_value_ && !could_be_heapobject;
277350bb868e274f7f873f683d591048376427ffdd72jkummerow@chromium.org  set_type(is_smi ? HType::Smi() : HType::TaggedNumber());
27748432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  Initialize(r);
27758432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org}
27768432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
27778432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org
2778d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgHConstant::HConstant(ExternalReference reference)
2779eac65cd57a2d5f018fc440eed1b69d0fe80fe336machenbach@chromium.org  : HTemplateInstruction<0>(HType::Any()),
27803d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    object_(Unique<Object>(Handle<Object>::null())),
2781af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    object_map_(Handle<Map>::null()),
278229699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org    has_stable_map_value_(false),
2783d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_smi_value_(false),
2784d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_int32_value_(false),
2785d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_double_value_(false),
2786d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    has_external_reference_value_(true),
2787d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    is_not_in_new_space_(true),
2788d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    boolean_value_(true),
2789bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    is_undetectable_(false),
2790bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    external_reference_value_(reference),
2791bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    instance_type_(kUnknownInstanceType) {
2792d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  Initialize(Representation::External());
2793d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
2794d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
2795d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
27968432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.orgvoid HConstant::Initialize(Representation r) {
279753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  if (r.IsNone()) {
2798ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org    if (has_smi_value_ && SmiValuesAre31Bits()) {
2799ca2f2040e0e1a10df95bec18e69499f85f4c1316machenbach@chromium.org      r = Representation::Smi();
2800c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    } else if (has_int32_value_) {
280153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      r = Representation::Integer32();
280253ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    } else if (has_double_value_) {
280353ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      r = Representation::Double();
2804d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    } else if (has_external_reference_value_) {
2805d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      r = Representation::External();
280653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    } else {
28073d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org      Handle<Object> object = object_.handle();
28083d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org      if (object->IsJSObject()) {
28093d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org        // Try to eagerly migrate JSObjects that have deprecated maps.
28103d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org        Handle<JSObject> js_object = Handle<JSObject>::cast(object);
28113d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org        if (js_object->map()->is_deprecated()) {
28123d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org          JSObject::TryMigrateInstance(js_object);
28133d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org        }
28143d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org      }
281553ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org      r = Representation::Tagged();
281653ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org    }
281753ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  }
2818b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  if (r.IsSmi()) {
2819b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // If we have an existing handle, zap it, because it might be a heap
2820b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // number which we must not re-use when copying this HConstant to
2821b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // Tagged representation later, because having Smi representation now
2822b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    // could cause heap object checks not to get emitted.
2823b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org    object_ = Unique<Object>(Handle<Object>::null());
2824b376fed08cb9d90a3f67f655adf63c4b35feb106machenbach@chromium.org  }
2825657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  set_representation(r);
2826657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  SetFlag(kUseGVN);
2827e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
2828e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
2829e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
283057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.orgbool HConstant::ImmortalImmovable() const {
283157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  if (has_int32_value_) {
283257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return false;
283357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
283457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  if (has_double_value_) {
283557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    if (IsSpecialDouble()) {
283657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      return true;
283757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    }
283857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return false;
283957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
284057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  if (has_external_reference_value_) {
284157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org    return false;
284257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  }
284357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
2844e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!object_.handle().is_null());
284557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  Heap* heap = isolate()->heap();
2846e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!object_.IsKnownGlobal(heap->minus_zero_value()));
2847e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!object_.IsKnownGlobal(heap->nan_value()));
284857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org  return
284957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#define IMMORTAL_IMMOVABLE_ROOT(name) \
285057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      object_.IsKnownGlobal(heap->name()) ||
285157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      IMMORTAL_IMMOVABLE_ROOT_LIST(IMMORTAL_IMMOVABLE_ROOT)
285257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#undef IMMORTAL_IMMOVABLE_ROOT
285357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#define INTERNALIZED_STRING(name, value) \
285457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      object_.IsKnownGlobal(heap->name()) ||
285557a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      INTERNALIZED_STRING_LIST(INTERNALIZED_STRING)
285657a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#undef INTERNALIZED_STRING
285757a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#define STRING_TYPE(NAME, size, name, Name) \
285857a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      object_.IsKnownGlobal(heap->name##_map()) ||
285957a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      STRING_TYPE_LIST(STRING_TYPE)
286057a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org#undef STRING_TYPE
286157a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org      false;
286257a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org}
286357a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
286457a54ace4b6b45d5d6a7ff38d88ee9990d47f5e2machenbach@chromium.org
2865e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgbool HConstant::EmitAtUses() {
2866e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(IsLinked());
2867528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  if (block()->graph()->has_osr() &&
2868528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org      block()->graph()->IsStandardConstant(this)) {
286971f9fca5cfb606009211e0631f33b76cc2ddce3cbmeurer@chromium.org    // TODO(titzer): this seems like a hack that should be fixed by custom OSR.
2870528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org    return true;
28718432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org  }
28724b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org  if (HasNoUses()) return true;
2873e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  if (IsCell()) return false;
2874e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  if (representation().IsDouble()) return false;
2875d06b9264b1c886fc80a100e9915cf8ae07fdb4e5machenbach@chromium.org  if (representation().IsExternal()) return false;
2876e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org  return true;
2877657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org}
2878657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
2879657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org
28807028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.orgHConstant* HConstant::CopyToRepresentation(Representation r, Zone* zone) const {
288153ad17558c81e6099cef4442237d7da643a5becfsvenpanne@chromium.org  if (r.IsSmi() && !has_smi_value_) return NULL;
2882a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (r.IsInteger32() && !has_int32_value_) return NULL;
2883a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (r.IsDouble() && !has_double_value_) return NULL;
2884d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (r.IsExternal() && !has_external_reference_value_) return NULL;
2885f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  if (has_int32_value_) {
28863d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    return new(zone) HConstant(int32_value_, r, is_not_in_new_space_, object_);
2887f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
2888f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  if (has_double_value_) {
28893d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org    return new(zone) HConstant(double_value_, r, is_not_in_new_space_, object_);
2890f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org  }
2891d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (has_external_reference_value_) {
2892d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return new(zone) HConstant(external_reference_value_);
2893d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
2894e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(!object_.handle().is_null());
28953d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org  return new(zone) HConstant(object_,
289629699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org                             object_map_,
289729699e37f62a9aa96c100f29bc8ea3668acff099machenbach@chromium.org                             has_stable_map_value_,
2898e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org                             r,
2899d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                             type_,
2900f005df6c3232e65028420519fbab7284bc9b33aedanno@chromium.org                             is_not_in_new_space_,
2901bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                             boolean_value_,
2902bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                             is_undetectable_,
2903bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org                             instance_type_);
2904a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2905a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2906a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2907c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgMaybe<HConstant*> HConstant::CopyToTruncatedInt32(Zone* zone) {
2908c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  HConstant* res = NULL;
2909657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  if (has_int32_value_) {
2910c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    res = new(zone) HConstant(int32_value_,
2911c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                              Representation::Integer32(),
2912c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                              is_not_in_new_space_,
29133d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org                              object_);
2914c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  } else if (has_double_value_) {
2915c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    res = new(zone) HConstant(DoubleToInt32(double_value_),
2916c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                              Representation::Integer32(),
2917c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org                              is_not_in_new_space_,
29183d079fe881245e49c7ba803b54b4fe6d4b46113cmachenbach@chromium.org                              object_);
2919657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  }
2920c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  return Maybe<HConstant*>(res != NULL, res);
2921c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org}
2922c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
2923c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
2924c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.orgMaybe<HConstant*> HConstant::CopyToTruncatedNumber(Zone* zone) {
2925c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  HConstant* res = NULL;
2926639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  Handle<Object> handle = this->handle(zone->isolate());
2927639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  if (handle->IsBoolean()) {
2928639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org    res = handle->BooleanValue() ?
2929c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org      new(zone) HConstant(1) : new(zone) HConstant(0);
2930639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  } else if (handle->IsUndefined()) {
29315de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org    res = new(zone) HConstant(base::OS::nan_value());
2932639bac0c5319f96e1bbe3399fb7f7f37344928bddslomov@chromium.org  } else if (handle->IsNull()) {
2933c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    res = new(zone) HConstant(0);
2934657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  }
2935c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  return Maybe<HConstant*>(res != NULL, res);
293644bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org}
293744bc7080a85cc25bff3b9b77cd53f7beffab711bkarlklose@chromium.org
29382bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
2939f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HConstant::PrintDataTo(OStream& os) const {  // NOLINT
2940657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  if (has_int32_value_) {
2941f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << int32_value_ << " ";
2942657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  } else if (has_double_value_) {
2943f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << double_value_ << " ";
2944d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  } else if (has_external_reference_value_) {
2945f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << reinterpret_cast<void*>(external_reference_value_.address()) << " ";
2946657d53b99cb4d261f8245bcb4248c39eb0a2b10frossberg@chromium.org  } else {
2947f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    // The handle() method is silently and lazily mutating the object.
2948f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    Handle<Object> h = const_cast<HConstant*>(this)->handle(Isolate::Current());
2949f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << Brief(*h) << " ";
2950f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (HasStableMapValue()) os << "[stable-map] ";
2951f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    if (HasObjectMap()) os << "[map " << *ObjectMap().handle() << "] ";
2952c8cbc43a1fd5fda5d6a1e172f720cbd1215157c8machenbach@chromium.org  }
2953f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (!is_not_in_new_space_) os << "[new space] ";
2954f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
2955a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2956a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2957a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2958f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HBinaryOperation::PrintDataTo(OStream& os) const {  // NOLINT
2959f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(left()) << " " << NameOf(right());
2960f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CheckFlag(kCanOverflow)) os << " !";
2961f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (CheckFlag(kBailoutOnMinusZero)) os << " -0?";
2962f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
2963a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
2964a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
2965a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
29661510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HBinaryOperation::InferRepresentation(HInferRepresentationPhase* h_infer) {
2967e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CheckFlag(kFlexibleRepresentation));
2968fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation new_rep = RepresentationFromInputs();
2969fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  UpdateRepresentation(new_rep, h_infer, "inputs");
29708e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org
29718e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  if (representation().IsSmi() && HasNonSmiUse()) {
29728e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org    UpdateRepresentation(
29738e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org        Representation::Integer32(), h_infer, "use requirements");
29748e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org  }
29758e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org
2976fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (observed_output_representation_.IsNone()) {
2977fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    new_rep = RepresentationFromUses();
2978fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    UpdateRepresentation(new_rep, h_infer, "uses");
2979fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  } else {
2980fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    new_rep = RepresentationFromOutput();
2981fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    UpdateRepresentation(new_rep, h_infer, "output");
2982b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  }
298332d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org}
298432d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
298532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org
2986fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgRepresentation HBinaryOperation::RepresentationFromInputs() {
2987fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // Determine the worst case of observed input representations and
2988fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // the currently assumed output representation.
2989fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation rep = representation();
2990fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  for (int i = 1; i <= 2; ++i) {
2991fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    rep = rep.generalize(observed_input_representation(i));
2992fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
2993fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // If any of the actual input representation is more general than what we
2994fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  // have so far but not Tagged, use that representation instead.
2995fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation left_rep = left()->representation();
2996fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation right_rep = right()->representation();
2997fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!left_rep.IsTagged()) rep = rep.generalize(left_rep);
2998fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  if (!right_rep.IsTagged()) rep = rep.generalize(right_rep);
2999fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
3000fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return rep;
3001fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
3002fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
3003fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
3004fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool HBinaryOperation::IgnoreObservedOutputRepresentation(
3005fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    Representation current_rep) {
3006fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return ((current_rep.IsInteger32() && CheckUsesForFlag(kTruncatingToInt32)) ||
3007fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          (current_rep.IsSmi() && CheckUsesForFlag(kTruncatingToSmi))) &&
3008fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org         // Mul in Integer32 mode would be too precise.
30098e36b5ba34174c8ceb04a47d7e10dcc8f43d94a4machenbach@chromium.org         (!this->IsMul() || HMul::cast(this)->MulMinusOne());
3010fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
3011fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
3012fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
3013fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgRepresentation HBinaryOperation::RepresentationFromOutput() {
3014fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  Representation rep = representation();
301532d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // Consider observed output representation, but ignore it if it's Double,
301632d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // this instruction is not a division, and all its uses are truncating
301732d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  // to Integer32.
301832d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  if (observed_output_representation_.is_more_general_than(rep) &&
301932d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org      !IgnoreObservedOutputRepresentation(rep)) {
3020fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    return observed_output_representation_;
302132d7dbafe29be06cec1edd36c31fbe2865c799f4ulan@chromium.org  }
3022fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return Representation::None();
3023fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
3024fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
3025fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
3026fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgvoid HBinaryOperation::AssumeRepresentation(Representation r) {
3027ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  set_observed_input_representation(1, r);
3028ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  set_observed_input_representation(2, r);
3029fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  HValue::AssumeRepresentation(r);
3030fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
3031fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
3032fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
30331510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HMathMinMax::InferRepresentation(HInferRepresentationPhase* h_infer) {
3034e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CheckFlag(kFlexibleRepresentation));
30355323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  Representation new_rep = RepresentationFromInputs();
30365323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  UpdateRepresentation(new_rep, h_infer, "inputs");
30375323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org  // Do not care about uses.
30385323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org}
30395323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org
30405323a9c29497eb5a52821d396990c6d75a37baf7jkummerow@chromium.org
3041812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HBitwise::InferRange(Zone* zone) {
3042d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  if (op() == Token::BIT_XOR) {
3043d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    if (left()->HasRange() && right()->HasRange()) {
3044d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      // The maximum value has the high bit, and all bits below, set:
3045d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      // (1 << high) - 1.
3046d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      // If the range can be negative, the minimum int is a negative number with
3047d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      // the high bit, and all bits below, unset:
3048d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      // -(1 << high).
3049d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      // If it cannot be negative, conservatively choose 0 as minimum int.
3050d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int64_t left_upper = left()->range()->upper();
3051d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int64_t left_lower = left()->range()->lower();
3052d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int64_t right_upper = right()->range()->upper();
3053d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int64_t right_lower = right()->range()->lower();
3054d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
3055d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      if (left_upper < 0) left_upper = ~left_upper;
3056d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      if (left_lower < 0) left_lower = ~left_lower;
3057d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      if (right_upper < 0) right_upper = ~right_upper;
3058d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      if (right_lower < 0) right_lower = ~right_lower;
3059d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
3060d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int high = MostSignificantBit(
3061d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org          static_cast<uint32_t>(
3062d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org              left_upper | left_lower | right_upper | right_lower));
3063d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org
3064d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int64_t limit = 1;
3065d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      limit <<= high;
3066d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      int32_t min = (left()->range()->CanBeNegative() ||
3067d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                     right()->range()->CanBeNegative())
3068d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                    ? static_cast<int32_t>(-limit) : 0;
3069d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org      return new(zone) Range(min, static_cast<int32_t>(limit - 1));
3070d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    }
3071bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    Range* result = HValue::InferRange(zone);
3072bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    result->set_can_be_minus_zero(false);
3073bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org    return result;
3074d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  }
3075bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com  const int32_t kDefaultMask = static_cast<int32_t>(0xffffffff);
30768f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  int32_t left_mask = (left()->range() != NULL)
30778f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org      ? left()->range()->Mask()
3078bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      : kDefaultMask;
30798f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org  int32_t right_mask = (right()->range() != NULL)
30808f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org      ? right()->range()->Mask()
3081bbceb57d27ec53f6d6212e690ead3174192ea3f9erik.corry@gmail.com      : kDefaultMask;
3082c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org  int32_t result_mask = (op() == Token::BIT_AND)
3083c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      ? left_mask & right_mask
3084c3b37129d6387b2db313f9100256d2d5f60dd9a8jkummerow@chromium.org      : left_mask | right_mask;
3085bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  if (result_mask >= 0) return new(zone) Range(0, result_mask);
3086bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org
3087bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  Range* result = HValue::InferRange(zone);
3088bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  result->set_can_be_minus_zero(false);
3089bee51999422c0eeaae85ed99b5c0bd4126510ff1danno@chromium.org  return result;
3090a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3091a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3092a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3093812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HSar::InferRange(Zone* zone) {
3094a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (right()->IsConstant()) {
3095a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HConstant* c = HConstant::cast(right());
3096a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (c->HasInteger32Value()) {
30978f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org      Range* result = (left()->range() != NULL)
3098812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org          ? left()->range()->Copy(zone)
3099812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org          : new(zone) Range();
31008f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org      result->Sar(c->Integer32Value());
3101a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return result;
3102a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
3103a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
3104812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return HValue::InferRange(zone);
3105a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3106a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3107a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3108812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HShr::InferRange(Zone* zone) {
31092c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  if (right()->IsConstant()) {
31102c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org    HConstant* c = HConstant::cast(right());
31112c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org    if (c->HasInteger32Value()) {
31122c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org      int shift_count = c->Integer32Value() & 0x1f;
31132c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org      if (left()->range()->CanBeNegative()) {
31142c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org        // Only compute bounds if the result always fits into an int32.
31152c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org        return (shift_count >= 1)
3116812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org            ? new(zone) Range(0,
3117812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org                              static_cast<uint32_t>(0xffffffff) >> shift_count)
3118812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org            : new(zone) Range();
31192c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org      } else {
31202c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org        // For positive inputs we can use the >> operator.
31212c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org        Range* result = (left()->range() != NULL)
3122812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org            ? left()->range()->Copy(zone)
3123812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org            : new(zone) Range();
31242c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org        result->Sar(c->Integer32Value());
31252c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org        return result;
31262c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org      }
31272c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org    }
31282c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org  }
3129812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return HValue::InferRange(zone);
31302c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org}
31312c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org
31322c99e28a7b1fcb3767dc7c0088514fe53be784c5ricow@chromium.org
3133812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.orgRange* HShl::InferRange(Zone* zone) {
3134a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  if (right()->IsConstant()) {
3135a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HConstant* c = HConstant::cast(right());
3136a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    if (c->HasInteger32Value()) {
31378f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org      Range* result = (left()->range() != NULL)
3138812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org          ? left()->range()->Copy(zone)
3139812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org          : new(zone) Range();
31408f806e8b8f108ca2c8899c5d31861ef1273dcd4akarlklose@chromium.org      result->Shl(c->Integer32Value());
3141a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org      return result;
3142a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    }
3143a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
3144812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org  return HValue::InferRange(zone);
3145a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3146a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3147a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3148d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgRange* HLoadNamedField::InferRange(Zone* zone) {
3149935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  if (access().representation().IsInteger8()) {
3150935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    return new(zone) Range(kMinInt8, kMaxInt8);
3151935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
3152935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  if (access().representation().IsUInteger8()) {
3153935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    return new(zone) Range(kMinUInt8, kMaxUInt8);
3154935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
3155935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  if (access().representation().IsInteger16()) {
3156935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    return new(zone) Range(kMinInt16, kMaxInt16);
3157935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  }
3158935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org  if (access().representation().IsUInteger16()) {
3159935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org    return new(zone) Range(kMinUInt16, kMaxUInt16);
3160d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  }
3161d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (access().IsStringLength()) {
3162d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    return new(zone) Range(0, String::kMaxLength);
3163d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  }
3164d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return HValue::InferRange(zone);
3165d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org}
3166d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
3167d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org
3168e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgRange* HLoadKeyed::InferRange(Zone* zone) {
3169659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  switch (elements_kind()) {
3170af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    case EXTERNAL_INT8_ELEMENTS:
3171935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      return new(zone) Range(kMinInt8, kMaxInt8);
3172af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    case EXTERNAL_UINT8_ELEMENTS:
3173af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    case EXTERNAL_UINT8_CLAMPED_ELEMENTS:
3174935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      return new(zone) Range(kMinUInt8, kMaxUInt8);
3175af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    case EXTERNAL_INT16_ELEMENTS:
3176935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      return new(zone) Range(kMinInt16, kMaxInt16);
3177af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org    case EXTERNAL_UINT16_ELEMENTS:
3178935a7790c70d49e252069bc2d34eaa72f8c6677fmachenbach@chromium.org      return new(zone) Range(kMinUInt16, kMaxUInt16);
3179659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org    default:
3180812308e1488cd8261e4dbbda1d8022642d522b9bulan@chromium.org      return HValue::InferRange(zone);
3181659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org  }
3182659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org}
3183659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org
3184a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3185f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCompareGeneric::PrintDataTo(OStream& os) const {  // NOLINT
3186f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << Token::Name(token()) << " ";
3187f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HBinaryOperation::PrintDataTo(os);
3188a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3189a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3190a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3191f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStringCompareAndBranch::PrintDataTo(OStream& os) const {  // NOLINT
3192f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << Token::Name(token()) << " ";
3193f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HControlInstruction::PrintDataTo(os);
31940ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
31950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
31960ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
3197f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCompareNumericAndBranch::PrintDataTo(OStream& os) const {  // NOLINT
3198f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << Token::Name(token()) << " " << NameOf(left()) << " " << NameOf(right());
3199f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HControlInstruction::PrintDataTo(os);
320083e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org}
320183e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
320283e168294456ca2f02db421a635f7d5f5d023966kmillikin@chromium.org
3203f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HCompareObjectEqAndBranch::PrintDataTo(OStream& os) const {  // NOLINT
3204f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(left()) << " " << NameOf(right());
3205f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HControlInstruction::PrintDataTo(os);
3206c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
3207c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3208c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3209d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.orgbool HCompareObjectEqAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
32108545d496a480910c08fd03335583971e4c6ea805machenbach@chromium.org  if (known_successor_index() != kNoKnownSuccessorIndex) {
32118545d496a480910c08fd03335583971e4c6ea805machenbach@chromium.org    *block = SuccessorAt(known_successor_index());
32128545d496a480910c08fd03335583971e4c6ea805machenbach@chromium.org    return true;
32138545d496a480910c08fd03335583971e4c6ea805machenbach@chromium.org  }
3214bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && left()->IsConstant() && right()->IsConstant()) {
3215486536df718553960f9700559e80e5b10b0d5994dslomov@chromium.org    *block = HConstant::cast(left())->DataEquals(HConstant::cast(right()))
3216bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        ? FirstSuccessor() : SecondSuccessor();
3217bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return true;
3218bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
3219bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  *block = NULL;
3220bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return false;
3221bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
3222bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3223bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3224bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool ConstantIsObject(HConstant* constant, Isolate* isolate) {
3225bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (constant->HasNumberValue()) return false;
3226bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (constant->GetUnique().IsKnownGlobal(isolate->heap()->null_value())) {
3227bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return true;
3228bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
3229bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (constant->IsUndetectable()) return false;
3230bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  InstanceType type = constant->GetInstanceType();
3231bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return (FIRST_NONCALLABLE_SPEC_OBJECT_TYPE <= type) &&
3232bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org         (type <= LAST_NONCALLABLE_SPEC_OBJECT_TYPE);
3233bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
3234bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3235bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3236bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool HIsObjectAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
3237bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && value()->IsConstant()) {
3238bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    *block = ConstantIsObject(HConstant::cast(value()), isolate())
3239bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        ? FirstSuccessor() : SecondSuccessor();
3240bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return true;
3241bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
3242bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  *block = NULL;
3243bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return false;
3244bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
3245bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3246bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3247bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool HIsStringAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
32488d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (known_successor_index() != kNoKnownSuccessorIndex) {
32498d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    *block = SuccessorAt(known_successor_index());
32508d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return true;
32518d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
3252bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && value()->IsConstant()) {
3253bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    *block = HConstant::cast(value())->HasStringValue()
3254bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        ? FirstSuccessor() : SecondSuccessor();
3255bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return true;
3256bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
32578d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (value()->type().IsString()) {
32588d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    *block = FirstSuccessor();
32598d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return true;
32608d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
32618d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  if (value()->type().IsSmi() ||
32628d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      value()->type().IsNull() ||
32638d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      value()->type().IsBoolean() ||
32648d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      value()->type().IsUndefined() ||
32658d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org      value()->type().IsJSObject()) {
32668d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    *block = SecondSuccessor();
32678d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org    return true;
32688d8413cae4e7eb777aaed22e2901c19f8d5d1297machenbach@chromium.org  }
3269bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  *block = NULL;
3270bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return false;
3271bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
3272bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3273bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3274bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool HIsUndetectableAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
3275bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && value()->IsConstant()) {
3276bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    *block = HConstant::cast(value())->IsUndetectable()
3277bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        ? FirstSuccessor() : SecondSuccessor();
3278bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    return true;
3279bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
3280bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  *block = NULL;
3281bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  return false;
3282bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org}
3283bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3284bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org
3285bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.orgbool HHasInstanceTypeAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
3286bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && value()->IsConstant()) {
3287bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    InstanceType type = HConstant::cast(value())->GetInstanceType();
3288bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    *block = (from_ <= type) && (type <= to_)
3289bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org        ? FirstSuccessor() : SecondSuccessor();
3290d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org    return true;
3291d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  }
3292d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  *block = NULL;
3293d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org  return false;
3294d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org}
3295d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
3296d8a3a149cb9dac7437e264a2fe50f680418c3a45jkummerow@chromium.org
3297c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.orgvoid HCompareHoleAndBranch::InferRepresentation(
3298c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org    HInferRepresentationPhase* h_infer) {
3299528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  ChangeRepresentation(value()->representation());
3300c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org}
3301c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
3302c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org
3303a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.orgbool HCompareNumericAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
3304a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  if (left() == right() &&
3305a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org      left()->representation().IsSmiOrInteger32()) {
3306a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org    *block = (token() == Token::EQ ||
3307a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org              token() == Token::EQ_STRICT ||
3308a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org              token() == Token::LTE ||
3309a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org              token() == Token::GTE)
3310a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org        ? FirstSuccessor() : SecondSuccessor();
3311a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org    return true;
3312a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  }
3313a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  *block = NULL;
3314a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org  return false;
3315a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org}
3316a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
3317a77ec9c2cf67e5b9c707fe42f33574526fed189amachenbach@chromium.org
33180cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgbool HCompareMinusZeroAndBranch::KnownSuccessorBlock(HBasicBlock** block) {
3319bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  if (FLAG_fold_constants && value()->IsConstant()) {
3320bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    HConstant* constant = HConstant::cast(value());
3321bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    if (constant->HasDoubleValue()) {
3322bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      *block = IsMinusZero(constant->DoubleValue())
3323bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org          ? FirstSuccessor() : SecondSuccessor();
3324bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org      return true;
3325bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org    }
3326bcc36723a2ace28fa3b0d7dd0d1de926d313fff9machenbach@chromium.org  }
33270cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  if (value()->representation().IsSmiOrInteger32()) {
33280cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    // A Smi or Integer32 cannot contain minus zero.
33290cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    *block = SecondSuccessor();
33300cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    return true;
33310cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  }
33320cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  *block = NULL;
33330cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  return false;
33340cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org}
33350cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
33360cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
33370cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.orgvoid HCompareMinusZeroAndBranch::InferRepresentation(
33380cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org    HInferRepresentationPhase* h_infer) {
33390cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org  ChangeRepresentation(value()->representation());
33400cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org}
33410cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
33420cc095007a3ccded63f6577751c6a04300eb7ae9machenbach@chromium.org
3343f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HGoto::PrintDataTo(OStream& os) const {  // NOLINT
3344f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << *SuccessorAt(0);
33454f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org}
33464f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
33474f693d6b99ffdbc05e5e211e08ed5039e13279d2ricow@chromium.org
3348e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgvoid HCompareNumericAndBranch::InferRepresentation(
33491510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.org    HInferRepresentationPhase* h_infer) {
3350fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation left_rep = left()->representation();
3351fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  Representation right_rep = right()->representation();
3352c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Representation observed_left = observed_input_representation(0);
3353c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  Representation observed_right = observed_input_representation(1);
3354c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
3355dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  Representation rep = Representation::None();
3356dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  rep = rep.generalize(observed_left);
3357dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  rep = rep.generalize(observed_right);
3358dfe53073738bbf16023d96fce5118358a1037fd3ulan@chromium.org  if (rep.IsNone() || rep.IsSmiOrInteger32()) {
3359c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    if (!left_rep.IsTagged()) rep = rep.generalize(left_rep);
3360c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    if (!right_rep.IsTagged()) rep = rep.generalize(right_rep);
3361fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  } else {
3362fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    rep = Representation::Double();
3363c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  }
3364c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
3365c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  if (rep.IsDouble()) {
33669a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // According to the ES5 spec (11.9.3, 11.8.5), Equality comparisons (==, ===
33679a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // and !=) have special handling of undefined, e.g. undefined == undefined
33689a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // is 'true'. Relational comparisons have a different semantic, first
33699a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // calling ToPrimitive() on their arguments.  The standard Crankshaft
3370e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    // tagged-to-double conversion to ensure the HCompareNumericAndBranch's
3371e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    // inputs are doubles caused 'undefined' to be converted to NaN. That's
3372e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org    // compatible out-of-the box with ordered relational comparisons (<, >, <=,
33739a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // >=). However, for equality comparisons (and for 'in' and 'instanceof'),
33749a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // it is not consistent with the spec. For example, it would cause undefined
33759a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // == undefined (should be true) to be evaluated as NaN == NaN
33769a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // (false). Therefore, any comparisons other than ordered relational
33779a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // comparisons must cause a deopt when one of their arguments is undefined.
33789a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    // See also v8:1434
3379b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org    if (Token::IsOrderedRelationalCompareOp(token_)) {
3380b99c75496e05b4cd58815ada1e39e6029130d11crossberg@chromium.org      SetFlag(kAllowUndefinedAsNaN);
33819a21ec41a2007f01ba18cf5fa48f7987e40e5109ulan@chromium.org    }
3382a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
3383fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  ChangeRepresentation(rep);
3384a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3385a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3386a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3387f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HParameter::PrintDataTo(OStream& os) const {  // NOLINT
3388f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << index();
3389a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3390a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3391a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3392f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadNamedField::PrintDataTo(OStream& os) const {  // NOLINT
3393f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(object()) << access_;
339409cae8d7af4e66e8d0088c19dcd0033042fa8a6bmachenbach@chromium.org
33955924917d324a643d00a8aefee030bd4acea0de0bmachenbach@chromium.org  if (maps() != NULL) {
3396f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << " [" << *maps()->at(0).handle();
3397af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org    for (int i = 1; i < maps()->size(); ++i) {
3398f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "," << *maps()->at(i).handle();
33999fa619507474a4c1c21c6935b3209070bc13a218machenbach@chromium.org    }
3400f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "]";
3401e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org  }
3402e9fd6580f52407c94d77bfcb4be04207f2ebb2f1machenbach@chromium.org
3403f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (HasDependency()) os << " " << NameOf(dependency());
3404f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
3405a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3406a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3407a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3408f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadNamedGeneric::PrintDataTo(OStream& os) const {  // NOLINT
3409f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  Handle<String> n = Handle<String>::cast(name());
3410f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(object()) << "." << n->ToCString().get();
34114acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org}
34124acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
34134acdc2c8d4caecf7606db8af710366c1d6e28fe5whesse@chromium.org
3414f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadKeyed::PrintDataTo(OStream& os) const {  // NOLINT
3415e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (!is_external()) {
3416f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << NameOf(elements());
3417e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  } else {
3418e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
3419e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org           elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
3420f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << NameOf(elements()) << "." << ElementsKindToString(elements_kind());
3421e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
3422e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
3423f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "[" << NameOf(key());
3424f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsDehoisted()) os << " + " << base_offset();
3425f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "]";
3426a6bbcc801f63c451f814d6da77a1a48fba3d36c6yangguo@chromium.org
3427f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (HasDependency()) os << " " << NameOf(dependency());
3428f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (RequiresHoleCheck()) os << " check_hole";
3429f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
3430a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3431a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3432a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3433975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgbool HLoadKeyed::TryIncreaseBaseOffset(uint32_t increase_by_value) {
3434975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // The base offset is usually simply the size of the array header, except
3435975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // with dehoisting adds an addition offset due to a array index key
3436975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // manipulation, in which case it becomes (array header size +
3437975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // constant-offset-from-key * kPointerSize)
3438975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  uint32_t base_offset = BaseOffsetField::decode(bit_field_);
3439975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  v8::base::internal::CheckedNumeric<uint32_t> addition_result = base_offset;
3440975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  addition_result += increase_by_value;
3441975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  if (!addition_result.IsValid()) return false;
3442975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  base_offset = addition_result.ValueOrDie();
3443975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  if (!BaseOffsetField::is_valid(base_offset)) return false;
3444975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  bit_field_ = BaseOffsetField::update(bit_field_, base_offset);
3445975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  return true;
3446975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org}
3447975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
3448975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
344994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgbool HLoadKeyed::UsesMustHandleHole() const {
34507028c05c1c71b9d5c5fe1bca01f2461d17a2dda7mmassi@chromium.org  if (IsFastPackedElementsKind(elements_kind())) {
3451be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    return false;
3452be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
3453be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
3454f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (IsExternalArrayElementsKind(elements_kind())) {
3455f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return false;
3456f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
3457f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
3458906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  if (hole_mode() == ALLOW_RETURN_HOLE) {
3459906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    if (IsFastDoubleElementsKind(elements_kind())) {
3460906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org      return AllUsesCanTreatHoleAsNaN();
3461906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    }
3462906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org    return true;
3463906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org  }
346494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
3465e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (IsFastDoubleElementsKind(elements_kind())) {
346694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    return false;
3467e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
3468e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org
3469c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  // Holes are only returned as tagged values.
3470c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  if (!representation().IsTagged()) {
3471c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    return false;
3472c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org  }
3473c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org
347483a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
347583a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org    HValue* use = it.value();
3476c118402c43ae44cf9255d36608a44886c98537c5jkummerow@chromium.org    if (!use->IsChange()) return false;
347783a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org  }
3478be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
347994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  return true;
348094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org}
348194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
348294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
3483906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.orgbool HLoadKeyed::AllUsesCanTreatHoleAsNaN() const {
3484c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org  return IsFastDoubleElementsKind(elements_kind()) &&
3485c00ec2b94bc5505fa81f81daefd956f5a8776a09danno@chromium.org      CheckUsesForFlag(HValue::kAllowUndefinedAsNaN);
3486906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org}
3487906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
3488906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org
348994b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.orgbool HLoadKeyed::RequiresHoleCheck() const {
349094b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  if (IsFastPackedElementsKind(elements_kind())) {
349194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    return false;
349294b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  }
349394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
3494f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (IsExternalArrayElementsKind(elements_kind())) {
3495f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return false;
3496f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
3497f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
349894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  return !UsesMustHandleHole();
349983a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org}
350083a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
350183a4728861129dc263ded92157f3e6389f851f19karlklose@chromium.org
3502f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadKeyedGeneric::PrintDataTo(OStream& os) const {  // NOLINT
3503f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(object()) << "[" << NameOf(key()) << "]";
35043a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
35053a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
35063a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
3507be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.orgHValue* HLoadKeyedGeneric::Canonicalize() {
3508be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  // Recognize generic keyed loads that use property name generated
3509be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  // by for-in statement as a key and rewrite them into fast property load
3510be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  // by index.
3511e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (key()->IsLoadKeyed()) {
3512e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    HLoadKeyed* key_load = HLoadKeyed::cast(key());
3513e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org    if (key_load->elements()->IsForInCacheArray()) {
3514be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org      HForInCacheArray* names_cache =
3515e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org          HForInCacheArray::cast(key_load->elements());
3516be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
3517be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org      if (names_cache->enumerable() == object()) {
3518be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org        HForInCacheArray* index_cache =
3519be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org            names_cache->index_cache();
3520be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org        HCheckMapValue* map_check =
3521d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            HCheckMapValue::New(block()->graph()->zone(),
3522d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                block()->graph()->GetInvalidContext(),
3523d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                object(),
3524d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                names_cache->map());
3525d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        HInstruction* index = HLoadKeyed::New(
3526d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            block()->graph()->zone(),
3527d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org            block()->graph()->GetInvalidContext(),
3528be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org            index_cache,
3529304cc33f8259ef467e8e3c79f448d0bae0e8cd85yangguo@chromium.org            key_load->key(),
3530e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org            key_load->key(),
3531e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org            key_load->elements_kind());
3532be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org        map_check->InsertBefore(this);
3533be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org        index->InsertBefore(this);
3534af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org        return Prepend(new(block()->zone()) HLoadFieldByIndex(
3535af4fba3c6d2a18866505de3e6798757dd1448c6dmachenbach@chromium.org            object(), index));
3536be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org      }
3537be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org    }
3538be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  }
3539be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
3540be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org  return this;
3541be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org}
3542be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
3543be6bd10d8264b7a05e0a04407eb98b253bc0f152kmillikin@chromium.org
3544f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStoreNamedGeneric::PrintDataTo(OStream& os) const {  // NOLINT
3545f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  Handle<String> n = Handle<String>::cast(name());
3546f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(object()) << "." << n->ToCString().get() << " = "
3547f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << NameOf(value());
3548a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3551f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStoreNamedField::PrintDataTo(OStream& os) const {  // NOLINT
3552f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(object()) << access_ << " = " << NameOf(value());
3553f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (NeedsWriteBarrier()) os << " (write-barrier)";
3554f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (has_transition()) os << " (transition map " << *transition_map() << ")";
3555f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
3556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3558a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3559f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStoreKeyed::PrintDataTo(OStream& os) const {  // NOLINT
3560e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  if (!is_external()) {
3561f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << NameOf(elements());
3562e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  } else {
3563e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(elements_kind() >= FIRST_EXTERNAL_ARRAY_ELEMENTS_KIND &&
3564e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org           elements_kind() <= LAST_EXTERNAL_ARRAY_ELEMENTS_KIND);
3565f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << NameOf(elements()) << "." << ElementsKindToString(elements_kind());
3566e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.org  }
3567a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3568f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "[" << NameOf(key());
3569f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsDehoisted()) os << " + " << base_offset();
3570f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "] = " << NameOf(value());
3571717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org}
3572717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
3573717967fd64e99e759ff094df6f069440cc866266rossberg@chromium.org
3574f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStoreKeyedGeneric::PrintDataTo(OStream& os) const {  // NOLINT
3575f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(object()) << "[" << NameOf(key())
3576f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << "] = " << NameOf(value());
35773a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org}
35783a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
35793a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.org
3580f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HTransitionElementsKind::PrintDataTo(OStream& os) const {  // NOLINT
3581f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(object());
3582528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  ElementsKind from_kind = original_map().handle()->elements_kind();
3583528ce02b8680a3ab6d75c7079f180a4016c69b7amachenbach@chromium.org  ElementsKind to_kind = transitioned_map().handle()->elements_kind();
3584f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << " " << *original_map().handle() << " ["
3585f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org     << ElementsAccessor::ForKind(from_kind)->name() << "] -> "
3586f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org     << *transitioned_map().handle() << " ["
3587f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org     << ElementsAccessor::ForKind(to_kind)->name() << "]";
3588f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsSimpleMapChangeTransition(from_kind, to_kind)) os << " (simple)";
3589f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
3590394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
3591394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
3592394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
3593f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadGlobalCell::PrintDataTo(OStream& os) const {  // NOLINT
3594f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "[" << *cell().handle() << "]";
3595f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org  if (details_.IsConfigurable()) os << " (configurable)";
3596f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (details_.IsReadOnly()) os << " (read-only)";
3597f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
3598c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com}
3599c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3600c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com
3601c1956679bbba3170352a8cc735e8218f9dbe6867jkummerow@chromium.orgbool HLoadGlobalCell::RequiresHoleCheck() const {
3602f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org  if (!details_.IsConfigurable()) return false;
3603c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
3604c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    HValue* use = it.value();
3605c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com    if (!use->IsChange()) return true;
3606c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  }
3607c3b670ff19220959730d7886892bc4beb95d2ebaerik.corry@gmail.com  return false;
3608a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3609a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3610a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3611f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadGlobalGeneric::PrintDataTo(OStream& os) const {  // NOLINT
3612f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << name()->ToCString().get() << " ";
3613c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org}
3614c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
3615c36ce6e8979bbbd43539f0a0effc87ea20dd65cckmillikin@chromium.org
3616f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HInnerAllocatedObject::PrintDataTo(OStream& os) const {  // NOLINT
3617f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(base_object()) << " offset ";
3618f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return offset()->PrintTo(os);
36192bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org}
36202bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
36212bda543d75374afd8d7e98f56ca99a57ae1b7bd1svenpanne@chromium.org
3622f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStoreGlobalCell::PrintDataTo(OStream& os) const {  // NOLINT
3623f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << "[" << *cell().handle() << "] = " << NameOf(value());
3624f1a5a1dc668380a183184ee7629703846eefcfaemachenbach@chromium.org  if (details_.IsConfigurable()) os << " (configurable)";
3625f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (details_.IsReadOnly()) os << " (read-only)";
3626f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os;
3627a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3628a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3629a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3630f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HLoadContextSlot::PrintDataTo(OStream& os) const {  // NOLINT
3631f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(value()) << "[" << slot_index() << "]";
363283aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org}
363383aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
363483aa54905e559090bea7771b83f188762cfcf082ricow@chromium.org
3635f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStoreContextSlot::PrintDataTo(OStream& os) const {  // NOLINT
3636f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << NameOf(context()) << "[" << slot_index()
3637f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org            << "] = " << NameOf(value());
3638c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org}
3639c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
3640c6c5718277d4047fad1e034396228ce15571b5a4sgjesse@chromium.org
3641a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Implementation of type inference and type conversions. Calculates
3642a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// the inferred type of this instruction based on the input operands.
3643a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
36443a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgHType HValue::CalculateInferredType() {
3645a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return type_;
3646a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3647a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3648a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
36493a5fd78f0ca6c2827bb05f69a373d152a9ce6ff3fschneider@chromium.orgHType HPhi::CalculateInferredType() {
3650d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  if (OperandCount() == 0) return HType::Tagged();
3651d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  HType result = OperandAt(0)->type();
3652d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  for (int i = 1; i < OperandCount(); ++i) {
3653a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HType current = OperandAt(i)->type();
3654a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    result = result.Combine(current);
3655a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
3656a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  return result;
3657a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
3658a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3659a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
3660394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.comHType HChange::CalculateInferredType() {
3661394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  if (from().IsDouble() && to().IsTagged()) return HType::HeapNumber();
3662394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com  return type();
3663394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
3664394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
3665394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
36661fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.orgRepresentation HUnaryMathOperation::RepresentationFromInputs() {
3667a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (SupportsFlexibleFloorAndRound() &&
3668a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      (op_ == kMathFloor || op_ == kMathRound)) {
3669a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    // Floor and Round always take a double input. The integral result can be
3670a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    // used as an integer or a double. Infer the representation from the uses.
3671a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    return Representation::None();
3672a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
36731fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Representation rep = representation();
36741fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // If any of the actual input representation is more general than what we
36751fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  // have so far but not Tagged, use that representation instead.
36761fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  Representation input_rep = value()->representation();
3677ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org  if (!input_rep.IsTagged()) {
3678ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org    rep = rep.generalize(input_rep);
3679ad75d6febf45d81dda1f4cd158c7eb97c0408a25danno@chromium.org  }
36801fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org  return rep;
36811fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org}
36821fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
36831fd77d58ca66b2711f09cdea32c0c2d1a01b3ae5danno@chromium.org
36848297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.orgbool HAllocate::HandleSideEffectDominator(GVNFlag side_effect,
3685169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org                                          HValue* dominator) {
3686e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(side_effect == kNewSpacePromotion);
3687cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  Zone* zone = block()->zone();
36888297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  if (!FLAG_use_allocation_folding) return false;
368910480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
3690169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // Try to fold allocations together with their dominating allocations.
369110480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org  if (!dominator->IsAllocate()) {
369210480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org    if (FLAG_trace_allocation_folding) {
369310480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org      PrintF("#%d (%s) cannot fold into #%d (%s)\n",
369410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org          id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
369510480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org    }
36968297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org    return false;
3697169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
369810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org
3699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  // Check whether we are folding within the same block for local folding.
3700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (FLAG_use_local_allocation_folding && dominator->block() != block()) {
3701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    if (FLAG_trace_allocation_folding) {
3702f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      PrintF("#%d (%s) cannot fold into #%d (%s), crosses basic blocks\n",
3703f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
3704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    }
3705f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    return false;
3706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  }
3707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org
3708cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HAllocate* dominator_allocate = HAllocate::cast(dominator);
3709cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HValue* dominator_size = dominator_allocate->size();
3710169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  HValue* current_size = size();
3711cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3712169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // TODO(hpayer): Add support for non-constant allocation in dominator.
371338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  if (!dominator_size->IsInteger32Constant()) {
371410480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org    if (FLAG_trace_allocation_folding) {
371538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      PrintF("#%d (%s) cannot fold into #%d (%s), "
371638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org             "dynamic allocation size in dominator\n",
371710480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org          id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
371810480471c0db59c51c15e57d2a3489551d61b273jkummerow@chromium.org    }
37198297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org    return false;
3720169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
3721169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
3722cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  dominator_allocate = GetFoldableDominator(dominator_allocate);
3723cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  if (dominator_allocate == NULL) {
37248297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org    return false;
3725cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  }
3726cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
372738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  if (!has_size_upper_bound()) {
372838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    if (FLAG_trace_allocation_folding) {
372938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      PrintF("#%d (%s) cannot fold into #%d (%s), "
373038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org             "can't estimate total allocation size\n",
373138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org          id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
373238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    }
373338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    return false;
373438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  }
373538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
373638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  if (!current_size->IsInteger32Constant()) {
373738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    // If it's not constant then it is a size_in_bytes calculation graph
373838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    // like this: (const_header_size + const_element_size * size).
3739e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(current_size->IsInstruction());
374038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
374138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    HInstruction* current_instr = HInstruction::cast(current_size);
374238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    if (!current_instr->Dominates(dominator_allocate)) {
374338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      if (FLAG_trace_allocation_folding) {
374438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org        PrintF("#%d (%s) cannot fold into #%d (%s), dynamic size "
374538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org               "value does not dominate target allocation\n",
374638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org            id(), Mnemonic(), dominator_allocate->id(),
374738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org            dominator_allocate->Mnemonic());
374838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      }
374938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      return false;
375038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    }
375138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  }
375238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
3753e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK((IsNewSpaceAllocation() &&
3754cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org         dominator_allocate->IsNewSpaceAllocation()) ||
3755cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org         (IsOldDataSpaceAllocation() &&
3756cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org         dominator_allocate->IsOldDataSpaceAllocation()) ||
3757cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org         (IsOldPointerSpaceAllocation() &&
3758cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org         dominator_allocate->IsOldPointerSpaceAllocation()));
3759cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3760169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // First update the size of the dominator allocate instruction.
3761cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  dominator_size = dominator_allocate->size();
3762662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  int32_t original_object_size =
3763169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org      HConstant::cast(dominator_size)->GetInteger32Constant();
3764662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  int32_t dominator_size_constant = original_object_size;
3765c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
3766c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  if (MustAllocateDoubleAligned()) {
3767c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    if ((dominator_size_constant & kDoubleAlignmentMask) != 0) {
3768c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org      dominator_size_constant += kDoubleSize / 2;
3769c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    }
3770c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  }
3771c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org
377238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  int32_t current_size_max_value = size_upper_bound()->GetInteger32Constant();
377338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  int32_t new_dominator_size = dominator_size_constant + current_size_max_value;
377438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
3775ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org  // Since we clear the first word after folded memory, we cannot use the
3776ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org  // whole Page::kMaxRegularHeapObjectSize memory.
3777ef9a2b9208396fda21c01fdff922975fe35d9c4amachenbach@chromium.org  if (new_dominator_size > Page::kMaxRegularHeapObjectSize - kPointerSize) {
3778c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    if (FLAG_trace_allocation_folding) {
3779c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org      PrintF("#%d (%s) cannot fold into #%d (%s) due to size: %d\n",
3780cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org          id(), Mnemonic(), dominator_allocate->id(),
3781cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org          dominator_allocate->Mnemonic(), new_dominator_size);
3782c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org    }
37838297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org    return false;
3784c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  }
3785cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
378638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  HInstruction* new_dominator_size_value;
378738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
378838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  if (current_size->IsInteger32Constant()) {
378938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    new_dominator_size_value =
379038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org        HConstant::CreateAndInsertBefore(zone,
379138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         context(),
379238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         new_dominator_size,
379338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         Representation::None(),
379438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         dominator_allocate);
379538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  } else {
379638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    HValue* new_dominator_size_constant =
379738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org        HConstant::CreateAndInsertBefore(zone,
379838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         context(),
379938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         dominator_size_constant,
380038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         Representation::Integer32(),
380138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org                                         dominator_allocate);
380238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
380338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    // Add old and new size together and insert.
380438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    current_size->ChangeRepresentation(Representation::Integer32());
380538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
380638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    new_dominator_size_value = HAdd::New(zone, context(),
380738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org        new_dominator_size_constant, current_size);
380838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    new_dominator_size_value->ClearFlag(HValue::kCanOverflow);
380938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    new_dominator_size_value->ChangeRepresentation(Representation::Integer32());
381038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
381138de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    new_dominator_size_value->InsertBefore(dominator_allocate);
381238de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  }
381338de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
381438de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  dominator_allocate->UpdateSize(new_dominator_size_value);
381538de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org
381638de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  if (MustAllocateDoubleAligned()) {
381738de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    if (!dominator_allocate->MustAllocateDoubleAligned()) {
381838de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org      dominator_allocate->MakeDoubleAligned();
381938de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org    }
382038de99aae2d4efc5796aa6935c1648447ec32fc8machenbach@chromium.org  }
3821169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
38223c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  bool keep_new_space_iterable = FLAG_log_gc || FLAG_heap_stats;
3823169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org#ifdef VERIFY_HEAP
38243c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  keep_new_space_iterable = keep_new_space_iterable || FLAG_verify_heap;
38253c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org#endif
38263c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org
38273c3c8d733702cb2b41471efa5eead1faf5b5711bmachenbach@chromium.org  if (keep_new_space_iterable && dominator_allocate->IsNewSpaceAllocation()) {
3828cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    dominator_allocate->MakePrefillWithFiller();
3829662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  } else {
3830662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    // TODO(hpayer): This is a short-term hack to make allocation mementos
3831662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    // work again in new space.
38322311a91865abb67c824e693a201a61d817c9bfb6hpayer@chromium.org    dominator_allocate->ClearNextMapWord(original_object_size);
3833c73d55b355913690124f3ee70c344035431cdd3ayangguo@chromium.org  }
3834169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
38359ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  dominator_allocate->UpdateClearNextMapWord(MustClearNextMapWord());
3836662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
3837169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  // After that replace the dominated allocate instruction.
38384f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org  HInstruction* inner_offset = HConstant::CreateAndInsertBefore(
38394f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      zone,
38404f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      context(),
38414f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      dominator_size_constant,
38424f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      Representation::None(),
38434f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org      this);
38444f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org
3845169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  HInstruction* dominated_allocate_instr =
3846d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      HInnerAllocatedObject::New(zone,
3847d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                 context(),
3848cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org                                 dominator_allocate,
38494f99be9ff2091451687891a05d99cc31990de709hpayer@chromium.org                                 inner_offset,
3850d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                                 type());
3851169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  dominated_allocate_instr->InsertBefore(this);
3852169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  DeleteAndReplaceWith(dominated_allocate_instr);
3853169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  if (FLAG_trace_allocation_folding) {
3854169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org    PrintF("#%d (%s) folded into #%d (%s)\n",
3855cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org        id(), Mnemonic(), dominator_allocate->id(),
3856cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org        dominator_allocate->Mnemonic());
3857cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  }
38588297530cd2b71ba1a2fe6f27ba1c030a20468306machenbach@chromium.org  return true;
3859cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org}
3860cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3861cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3862cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.orgHAllocate* HAllocate::GetFoldableDominator(HAllocate* dominator) {
3863cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  if (!IsFoldable(dominator)) {
3864cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // We cannot hoist old space allocations over new space allocations.
3865cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    if (IsNewSpaceAllocation() || dominator->IsNewSpaceAllocation()) {
3866cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      if (FLAG_trace_allocation_folding) {
3867cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org        PrintF("#%d (%s) cannot fold into #%d (%s), new space hoisting\n",
3868cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org            id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
3869cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      }
3870cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      return NULL;
3871cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    }
3872cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3873cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    HAllocate* dominator_dominator = dominator->dominating_allocate_;
3874cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3875cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // We can hoist old data space allocations over an old pointer space
3876cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // allocation and vice versa. For that we have to check the dominator
3877cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // of the dominator allocate instruction.
3878cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    if (dominator_dominator == NULL) {
3879cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      dominating_allocate_ = dominator;
3880cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      if (FLAG_trace_allocation_folding) {
3881cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org        PrintF("#%d (%s) cannot fold into #%d (%s), different spaces\n",
3882cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org            id(), Mnemonic(), dominator->id(), dominator->Mnemonic());
3883cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      }
3884cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      return NULL;
3885cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    }
3886cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3887cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // We can just fold old space allocations that are in the same basic block,
3888cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // since it is not guaranteed that we fill up the whole allocated old
3889cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // space memory.
3890cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // TODO(hpayer): Remove this limitation and add filler maps for each each
3891cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // allocation as soon as we have store elimination.
3892cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    if (block()->block_id() != dominator_dominator->block()->block_id()) {
3893cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      if (FLAG_trace_allocation_folding) {
3894cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org        PrintF("#%d (%s) cannot fold into #%d (%s), different basic blocks\n",
3895cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org            id(), Mnemonic(), dominator_dominator->id(),
3896cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org            dominator_dominator->Mnemonic());
3897cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      }
3898cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      return NULL;
3899cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    }
3900cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3901e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK((IsOldDataSpaceAllocation() &&
3902cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org           dominator_dominator->IsOldDataSpaceAllocation()) ||
3903cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org           (IsOldPointerSpaceAllocation() &&
3904cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org           dominator_dominator->IsOldPointerSpaceAllocation()));
3905cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3906cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    int32_t current_size = HConstant::cast(size())->GetInteger32Constant();
3907cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    HStoreNamedField* dominator_free_space_size =
3908cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org        dominator->filler_free_space_size_;
3909cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    if (dominator_free_space_size != NULL) {
3910cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      // We already hoisted one old space allocation, i.e., we already installed
3911cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      // a filler map. Hence, we just have to update the free space size.
3912cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      dominator->UpdateFreeSpaceFiller(current_size);
3913cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    } else {
3914cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      // This is the first old space allocation that gets hoisted. We have to
3915cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      // install a filler map since the follwing allocation may cause a GC.
3916cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      dominator->CreateFreeSpaceFiller(current_size);
3917cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    }
3918cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3919cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    // We can hoist the old space allocation over the actual dominator.
3920cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org    return dominator_dominator;
3921169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org  }
3922cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  return dominator;
3923cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org}
3924cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3925cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3926cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.orgvoid HAllocate::UpdateFreeSpaceFiller(int32_t free_space_size) {
3927e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(filler_free_space_size_ != NULL);
3928cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  Zone* zone = block()->zone();
3929cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // We must explicitly force Smi representation here because on x64 we
3930cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // would otherwise automatically choose int32, but the actual store
3931cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // requires a Smi-tagged value.
3932cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HConstant* new_free_space_size = HConstant::CreateAndInsertBefore(
3933cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      zone,
3934cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      context(),
3935cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      filler_free_space_size_->value()->GetInteger32Constant() +
3936cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org          free_space_size,
3937cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      Representation::Smi(),
3938cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      filler_free_space_size_);
3939cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  filler_free_space_size_->UpdateValue(new_free_space_size);
3940cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org}
3941cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3942cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3943cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.orgvoid HAllocate::CreateFreeSpaceFiller(int32_t free_space_size) {
3944e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(filler_free_space_size_ == NULL);
3945cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  Zone* zone = block()->zone();
3946cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HInstruction* free_space_instr =
3947cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      HInnerAllocatedObject::New(zone, context(), dominating_allocate_,
3948ce9c514a4e015930324b2b45326a478a69535388machenbach@chromium.org      dominating_allocate_->size(), type());
3949cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  free_space_instr->InsertBefore(this);
3950af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org  HConstant* filler_map = HConstant::CreateAndInsertAfter(
3951af6f699b0be532b73bc2f6c9e1cf40a57fa7e234machenbach@chromium.org      zone, Unique<Map>::CreateImmovable(
3952a3b66334e4dd35d9d4874d275ef9c4a756f0225cmachenbach@chromium.org          isolate()->factory()->free_space_map()), true, free_space_instr);
3953cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HInstruction* store_map = HStoreNamedField::New(zone, context(),
39540a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org      free_space_instr, HObjectAccess::ForMap(), filler_map);
3955cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  store_map->SetFlag(HValue::kHasNoObservableSideEffects);
3956cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  store_map->InsertAfter(filler_map);
3957cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org
3958cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // We must explicitly force Smi representation here because on x64 we
3959cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // would otherwise automatically choose int32, but the actual store
3960cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // requires a Smi-tagged value.
3961cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HConstant* filler_size = HConstant::CreateAndInsertAfter(
3962cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org      zone, context(), free_space_size, Representation::Smi(), store_map);
3963cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  // Must force Smi representation for x64 (see comment above).
3964cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HObjectAccess access =
39650a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org      HObjectAccess::ForMapAndOffset(isolate()->factory()->free_space_map(),
39660a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org                                     FreeSpace::kSizeOffset,
39670a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org                                     Representation::Smi());
3968cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  HStoreNamedField* store_size = HStoreNamedField::New(zone, context(),
39690a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org      free_space_instr, access, filler_size);
3970cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  store_size->SetFlag(HValue::kHasNoObservableSideEffects);
3971cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  store_size->InsertAfter(filler_size);
3972cc8e177451e2ab80cf4eacfd782d19cd05ec2070hpayer@chromium.org  filler_free_space_size_ = store_size;
3973169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org}
3974169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
3975169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org
3976662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgvoid HAllocate::ClearNextMapWord(int offset) {
39779ca3017c616a778baff6d57c68d6d4746a130036ulan@chromium.org  if (MustClearNextMapWord()) {
3978662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    Zone* zone = block()->zone();
39790a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    HObjectAccess access =
39800a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org        HObjectAccess::ForObservableJSObjectOffset(offset);
3981662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    HStoreNamedField* clear_next_map =
3982662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org        HStoreNamedField::New(zone, context(), this, access,
39830a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org            block()->graph()->GetConstant0());
3984662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    clear_next_map->ClearAllSideEffects();
3985662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org    clear_next_map->InsertAfter(this);
3986662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  }
3987662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
3988662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
3989662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
3990f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HAllocate::PrintDataTo(OStream& os) const {  // NOLINT
3991f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << NameOf(size()) << " (";
3992f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsNewSpaceAllocation()) os << "N";
3993f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsOldPointerSpaceAllocation()) os << "P";
3994f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (IsOldDataSpaceAllocation()) os << "D";
3995f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (MustAllocateDoubleAligned()) os << "A";
3996f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (MustPrefillWithFiller()) os << "F";
3997f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << ")";
3998394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com}
3999394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
4000394dbcf9009cf5203b6d85e8b515fcff072040f3erik.corry@gmail.com
4001975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.orgbool HStoreKeyed::TryIncreaseBaseOffset(uint32_t increase_by_value) {
4002975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // The base offset is usually simply the size of the array header, except
4003975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // with dehoisting adds an addition offset due to a array index key
4004975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // manipulation, in which case it becomes (array header size +
4005975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  // constant-offset-from-key * kPointerSize)
4006975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  v8::base::internal::CheckedNumeric<uint32_t> addition_result = base_offset_;
4007975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  addition_result += increase_by_value;
4008975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  if (!addition_result.IsValid()) return false;
4009975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  base_offset_ = addition_result.ValueOrDie();
4010975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org  return true;
4011975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org}
4012975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
4013975b940441085887fc02bebf8877d5ec97e1e06cmachenbach@chromium.org
4014e4ee6de0de64744d55b63da83156827c989c7099verwaest@chromium.orgbool HStoreKeyed::NeedsCanonicalization() {
401594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  // If value is an integer or smi or comes from the result of a keyed load or
401694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  // constant then it is either be a non-hole value or in the case of a constant
401794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  // the hole is only being stored explicitly: no need for canonicalization.
4018f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  //
4019f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // The exception to that is keyed loads from external float or double arrays:
4020f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  // these can load arbitrary representation of NaN.
4021f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
4022f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (value()->IsConstant()) {
402328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org    return false;
402428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  }
402594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org
4026f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  if (value()->IsLoadKeyed()) {
4027f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org    return IsExternalFloatOrDoubleElementsKind(
4028f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org        HLoadKeyed::cast(value())->elements_kind());
4029f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org  }
4030f705b5034dc5bc422ac1019b591469a7d0534772mstarzinger@chromium.org
403194b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  if (value()->IsChange()) {
4032fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    if (HChange::cast(value())->from().IsSmiOrInteger32()) {
403394b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org      return false;
403494b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    }
403594b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    if (HChange::cast(value())->value()->type().IsSmi()) {
403694b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org      return false;
403794b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org    }
403894b0d6fcb08a2f01ba52c6edb712068f482366f1danno@chromium.org  }
403928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org  return true;
404028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org}
404128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
404228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
4043d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org#define H_CONSTANT_INT(val)                                                    \
4044d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgHConstant::New(zone, context, static_cast<int32_t>(val))
40450ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry#define H_CONSTANT_DOUBLE(val)                                                 \
4046d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgHConstant::New(zone, context, static_cast<double>(val))
40470ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
40480ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry#define DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HInstr, op)                       \
40492e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HInstr::New(                                                     \
40502e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* left, HValue* right) {                \
40512e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {      \
40520ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_left = HConstant::cast(left);                                 \
40530ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_right = HConstant::cast(right);                               \
40540ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {             \
40550ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      double double_res = c_left->DoubleValue() op c_right->DoubleValue();     \
4056ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org      if (IsInt32Double(double_res)) {                                         \
4057d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        return H_CONSTANT_INT(double_res);                                     \
40580ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      }                                                                        \
40590ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      return H_CONSTANT_DOUBLE(double_res);                                    \
40600ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    }                                                                          \
40610ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }                                                                            \
40620ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return new(zone) HInstr(context, left, right);                               \
40630ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
40640ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
40650ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
40660ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HAdd, +)
40670ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HMul, *)
40680ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryDEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR(HSub, -)
40690ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
40700ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry#undef DEFINE_NEW_H_SIMPLE_ARITHMETIC_INSTR
40710ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
40720ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
4073ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.orgHInstruction* HStringAdd::New(Zone* zone,
4074ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                              HValue* context,
4075ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                              HValue* left,
4076ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org                              HValue* right,
40770f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org                              PretenureFlag pretenure_flag,
40780f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org                              StringAddFlags flags,
40790f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org                              Handle<AllocationSite> allocation_site) {
40802e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
40812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_right = HConstant::cast(right);
40822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_left = HConstant::cast(left);
40832e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (c_left->HasStringValue() && c_right->HasStringValue()) {
4084b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      Handle<String> left_string = c_left->StringValue();
4085b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      Handle<String> right_string = c_right->StringValue();
4086b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      // Prevent possible exception by invalid string length.
4087b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      if (left_string->length() + right_string->length() < String::kMaxLength) {
4088d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org        MaybeHandle<String> concat = zone->isolate()->factory()->NewConsString(
4089b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org            c_left->StringValue(), c_right->StringValue());
4090d6472083da14af6fde0101cc78f95ababd7cc077machenbach@chromium.org        return HConstant::New(zone, context, concat.ToHandleChecked());
4091b5ed9300c59e8590c9dc588727b6564c244b0f5cmachenbach@chromium.org      }
40922e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
40932e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  }
40940f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  return new(zone) HStringAdd(
40950f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org      context, left, right, pretenure_flag, flags, allocation_site);
40960f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org}
40970f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org
40980f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org
4099f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HStringAdd::PrintDataTo(OStream& os) const {  // NOLINT
41000f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_BOTH) {
4101f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "_CheckBoth";
41020f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_LEFT) {
4103f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "_CheckLeft";
41040f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  } else if ((flags() & STRING_ADD_CHECK_BOTH) == STRING_ADD_CHECK_RIGHT) {
4105f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "_CheckRight";
41060f13e74b7310d8b14f19c6b93b36ff95059f97f6ulan@chromium.org  }
4107f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  HBinaryOperation::PrintDataTo(os);
4108f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << " (";
4109f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  if (pretenure_flag() == NOT_TENURED)
4110f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "N";
4111f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  else if (pretenure_flag() == TENURED)
4112f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    os << "D";
4113f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << ")";
41142e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
41152e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
41162e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
41172e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HStringCharFromCode::New(
41182e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* char_code) {
41192e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && char_code->IsConstant()) {
41202e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_code = HConstant::cast(char_code);
41213d00d0a753cf5e5091f883517e6612ece769f999jkummerow@chromium.org    Isolate* isolate = zone->isolate();
41222e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (c_code->HasNumberValue()) {
412377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org      if (std::isfinite(c_code->DoubleValue())) {
41242e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        uint32_t code = c_code->NumberValueAsInteger32() & 0xffff;
4125d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        return HConstant::New(zone, context,
41269e41f9ecf5042292a9efcb36e264b37621199553machenbach@chromium.org            isolate->factory()->LookupSingleCharacterStringFromCode(code));
41272e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      }
4128d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return HConstant::New(zone, context, isolate->factory()->empty_string());
41292e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
41302e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  }
41312e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  return new(zone) HStringCharFromCode(context, char_code);
41322e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
41332e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
41342e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
41352e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HUnaryMathOperation::New(
41362e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* value, BuiltinFunctionId op) {
41372e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  do {
41382e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (!FLAG_fold_constants) break;
41392e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (!value->IsConstant()) break;
41402e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* constant = HConstant::cast(value);
41412e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (!constant->HasNumberValue()) break;
41422e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    double d = constant->DoubleValue();
414377ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    if (std::isnan(d)) {  // NaN poisons everything.
41445de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      return H_CONSTANT_DOUBLE(base::OS::nan_value());
41452e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
414677ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org    if (std::isinf(d)) {  // +Infinity and -Infinity.
41472e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      switch (op) {
41482e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathExp:
41492e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          return H_CONSTANT_DOUBLE((d > 0.0) ? d : 0.0);
41502e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathLog:
41512e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathSqrt:
41525de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org          return H_CONSTANT_DOUBLE((d > 0.0) ? d : base::OS::nan_value());
41532e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathPowHalf:
41542e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathAbs:
41552e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          return H_CONSTANT_DOUBLE((d > 0.0) ? d : -d);
41562e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathRound:
4157dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org        case kMathFround:
41582e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        case kMathFloor:
41592e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          return H_CONSTANT_DOUBLE(d);
4160f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        case kMathClz32:
4161f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org          return H_CONSTANT_INT(32);
41622e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        default:
41632e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          UNREACHABLE();
41642e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          break;
41652e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      }
41662e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
41672e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    switch (op) {
41682e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathExp:
41692e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        return H_CONSTANT_DOUBLE(fast_exp(d));
41702e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathLog:
4171e31286d471eb2e656a1809383fa16b76053dd673machenbach@chromium.org        return H_CONSTANT_DOUBLE(std::log(d));
41722e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathSqrt:
41732e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        return H_CONSTANT_DOUBLE(fast_sqrt(d));
41742e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathPowHalf:
41752e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        return H_CONSTANT_DOUBLE(power_double_double(d, 0.5));
41762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathAbs:
41772e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        return H_CONSTANT_DOUBLE((d >= 0.0) ? d + 0.0 : -d);
41782e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathRound:
41792e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        // -0.5 .. -0.0 round to -0.0.
41802e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if ((d >= -0.5 && Double(d).Sign() < 0)) return H_CONSTANT_DOUBLE(-0.0);
41812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        // Doubles are represented as Significant * 2 ^ Exponent. If the
41822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        // Exponent is not negative, the double value is already an integer.
41832e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (Double(d).Exponent() >= 0) return H_CONSTANT_DOUBLE(d);
4184dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org        return H_CONSTANT_DOUBLE(Floor(d + 0.5));
4185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org      case kMathFround:
4186dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org        return H_CONSTANT_DOUBLE(static_cast<double>(static_cast<float>(d)));
41872e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      case kMathFloor:
4188dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org        return H_CONSTANT_DOUBLE(Floor(d));
4189f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      case kMathClz32: {
4190f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        uint32_t i = DoubleToUint32(d);
4191e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org        return H_CONSTANT_INT(base::bits::CountLeadingZeros32(i));
4192f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
41932e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      default:
41942e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        UNREACHABLE();
41952e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        break;
41962e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
41972e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  } while (false);
41982e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  return new(zone) HUnaryMathOperation(context, value, op);
41992e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
42002e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
42012e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
4202a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.orgRepresentation HUnaryMathOperation::RepresentationFromUses() {
4203a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  if (op_ != kMathFloor && op_ != kMathRound) {
4204a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    return HValue::RepresentationFromUses();
4205a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
4206a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
4207a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // The instruction can have an int32 or double output. Prefer a double
4208a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  // representation if there are double uses.
4209a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  bool use_double = false;
4210a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
4211a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
4212a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    HValue* use = it.value();
4213a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    int use_index = it.index();
4214a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    Representation rep_observed = use->observed_input_representation(use_index);
4215a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    Representation rep_required = use->RequiredInputRepresentation(use_index);
4216a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    use_double |= (rep_observed.IsDouble() || rep_required.IsDouble());
4217a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    if (use_double && !FLAG_trace_representation) {
4218a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      // Having seen one double is enough.
4219a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      break;
4220a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    }
4221a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    if (FLAG_trace_representation) {
4222a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      if (!rep_required.IsDouble() || rep_observed.IsDouble()) {
4223a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        PrintF("#%d %s is used by #%d %s as %s%s\n",
4224a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org               id(), Mnemonic(), use->id(),
4225a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org               use->Mnemonic(), rep_observed.Mnemonic(),
4226a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org               (use->CheckFlag(kTruncatingToInt32) ? "-trunc" : ""));
4227a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      } else {
4228a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org        PrintF("#%d %s is required by #%d %s as %s%s\n",
4229a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org               id(), Mnemonic(), use->id(),
4230a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org               use->Mnemonic(), rep_required.Mnemonic(),
4231a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org               (use->CheckFlag(kTruncatingToInt32) ? "-trunc" : ""));
4232a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org      }
4233a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org    }
4234a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  }
4235a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org  return use_double ? Representation::Double() : Representation::Integer32();
4236a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org}
4237a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
4238a86d416fb652b1936026eee315eccd4f17ca1002machenbach@chromium.org
4239d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.orgHInstruction* HPower::New(Zone* zone,
4240d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                          HValue* context,
4241d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                          HValue* left,
4242d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                          HValue* right) {
42432e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
42442e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_left = HConstant::cast(left);
42452e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_right = HConstant::cast(right);
42462e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (c_left->HasNumberValue() && c_right->HasNumberValue()) {
42472e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      double result = power_helper(c_left->DoubleValue(),
42482e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                                   c_right->DoubleValue());
42495de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      return H_CONSTANT_DOUBLE(std::isnan(result) ? base::OS::nan_value()
42505de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org                                                  : result);
42512e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
42522e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  }
42532e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  return new(zone) HPower(left, right);
42542e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
42552e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
42562e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
42572e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HMathMinMax::New(
42582e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* left, HValue* right, Operation op) {
42592e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
42602e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_left = HConstant::cast(left);
42612e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    HConstant* c_right = HConstant::cast(right);
42622e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    if (c_left->HasNumberValue() && c_right->HasNumberValue()) {
42632e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      double d_left = c_left->DoubleValue();
42642e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      double d_right = c_right->DoubleValue();
42652e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      if (op == kMathMin) {
42662e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (d_left > d_right) return H_CONSTANT_DOUBLE(d_right);
42672e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (d_left < d_right) return H_CONSTANT_DOUBLE(d_left);
42682e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (d_left == d_right) {
42692e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          // Handle +0 and -0.
42702e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          return H_CONSTANT_DOUBLE((Double(d_left).Sign() == -1) ? d_left
42712e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                                                                 : d_right);
42722e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        }
42732e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      } else {
42742e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (d_left < d_right) return H_CONSTANT_DOUBLE(d_right);
42752e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (d_left > d_right) return H_CONSTANT_DOUBLE(d_left);
42762e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        if (d_left == d_right) {
42772e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          // Handle +0 and -0.
42782e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org          return H_CONSTANT_DOUBLE((Double(d_left).Sign() == -1) ? d_right
42792e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                                                                 : d_left);
42802e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        }
42812e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      }
42822e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      // All comparisons failed, must be NaN.
42835de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org      return H_CONSTANT_DOUBLE(base::OS::nan_value());
42842e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    }
42852e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  }
42862e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  return new(zone) HMathMinMax(context, left, right, op);
42872e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org}
42882e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
42892e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org
4290d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.orgHInstruction* HMod::New(Zone* zone,
4291d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                        HValue* context,
4292d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org                        HValue* left,
42937ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org                        HValue* right) {
42942e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
42950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_left = HConstant::cast(left);
42960ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_right = HConstant::cast(right);
42970ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    if (c_left->HasInteger32Value() && c_right->HasInteger32Value()) {
42980ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t dividend = c_left->Integer32Value();
42990ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t divisor = c_right->Integer32Value();
4300906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org      if (dividend == kMinInt && divisor == -1) {
4301906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org        return H_CONSTANT_DOUBLE(-0.0);
4302906e2fb760f52fe6e75b744b1ea42576ea5b2c29ulan@chromium.org      }
43030ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      if (divisor != 0) {
43040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        int32_t res = dividend % divisor;
43050ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        if ((res == 0) && (dividend < 0)) {
43060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          return H_CONSTANT_DOUBLE(-0.0);
43070ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        }
4308fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        return H_CONSTANT_INT(res);
43090ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      }
43100ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    }
43110ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
43127ff7607c2315ea91e4d13330ce14125e4bb4851amachenbach@chromium.org  return new(zone) HMod(context, left, right);
43130ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
43140ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43150ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43162e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HDiv::New(
43172e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* left, HValue* right) {
43180ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  // If left and right are constant values, try to return a constant value.
43192e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
43200ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_left = HConstant::cast(left);
43210ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_right = HConstant::cast(right);
43220ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
43230ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      if (c_right->DoubleValue() != 0) {
43240ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        double double_res = c_left->DoubleValue() / c_right->DoubleValue();
4325ea9b8ba58955b7efcc3e1550dd33a44fb4530136hpayer@chromium.org        if (IsInt32Double(double_res)) {
4326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          return H_CONSTANT_INT(double_res);
43270ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        }
43280ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        return H_CONSTANT_DOUBLE(double_res);
43292e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org      } else {
43302e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        int sign = Double(c_left->DoubleValue()).Sign() *
43312e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org                   Double(c_right->DoubleValue()).Sign();  // Right could be -0.
43322e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        return H_CONSTANT_DOUBLE(sign * V8_INFINITY);
43330ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      }
43340ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    }
43350ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
43360ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return new(zone) HDiv(context, left, right);
43370ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
43380ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43390ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43402e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HBitwise::New(
4341d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    Zone* zone, HValue* context, Token::Value op, HValue* left, HValue* right) {
43422e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
43430ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_left = HConstant::cast(left);
43440ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_right = HConstant::cast(right);
43450ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
43460ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t result;
43470ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t v_left = c_left->NumberValueAsInteger32();
43480ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t v_right = c_right->NumberValueAsInteger32();
43490ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      switch (op) {
43500ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        case Token::BIT_XOR:
43510ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          result = v_left ^ v_right;
43520ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          break;
43530ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        case Token::BIT_AND:
43540ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          result = v_left & v_right;
43550ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          break;
43560ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        case Token::BIT_OR:
43570ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          result = v_left | v_right;
43580ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          break;
43590ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry        default:
43600ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          result = 0;  // Please the compiler.
43610ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry          UNREACHABLE();
43620ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      }
4363fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return H_CONSTANT_INT(result);
43640ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    }
43650ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
4366d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org  return new(zone) HBitwise(context, op, left, right);
43670ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
43680ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43690ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43700ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry#define DEFINE_NEW_H_BITWISE_INSTR(HInstr, result)                             \
43712e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HInstr::New(                                                     \
43722e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* left, HValue* right) {                \
43732e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {      \
43740ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_left = HConstant::cast(left);                                 \
43750ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_right = HConstant::cast(right);                               \
43760ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {             \
4377fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return H_CONSTANT_INT(result);                                           \
43780ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    }                                                                          \
43790ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }                                                                            \
43800ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return new(zone) HInstr(context, left, right);                               \
43810ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
43820ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43830ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43840ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryDEFINE_NEW_H_BITWISE_INSTR(HSar,
43850ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryc_left->NumberValueAsInteger32() >> (c_right->NumberValueAsInteger32() & 0x1f))
43860ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryDEFINE_NEW_H_BITWISE_INSTR(HShl,
43870ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorryc_left->NumberValueAsInteger32() << (c_right->NumberValueAsInteger32() & 0x1f))
43880ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43890ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry#undef DEFINE_NEW_H_BITWISE_INSTR
43900ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43910ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
43922e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.orgHInstruction* HShr::New(
43932e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org    Zone* zone, HValue* context, HValue* left, HValue* right) {
43942e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org  if (FLAG_fold_constants && left->IsConstant() && right->IsConstant()) {
43950ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_left = HConstant::cast(left);
43960ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    HConstant* c_right = HConstant::cast(right);
43970ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    if ((c_left->HasNumberValue() && c_right->HasNumberValue())) {
43980ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t left_val = c_left->NumberValueAsInteger32();
43990ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      int32_t right_val = c_right->NumberValueAsInteger32() & 0x1f;
44000ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      if ((right_val == 0) && (left_val < 0)) {
44012e04b58f1dc7cee8fdf047b5dbc9dc93e767821dulan@chromium.org        return H_CONSTANT_DOUBLE(static_cast<uint32_t>(left_val));
44020ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry      }
4403fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org      return H_CONSTANT_INT(static_cast<uint32_t>(left_val) >> right_val);
44040ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry    }
44050ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  }
44060ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry  return new(zone) HShr(context, left, right);
44070ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry}
44080ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
44090ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
4410e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.orgHInstruction* HSeqStringGetChar::New(Zone* zone,
4411e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                                     HValue* context,
4412e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                                     String::Encoding encoding,
4413e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                                     HValue* string,
4414e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org                                     HValue* index) {
4415e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  if (FLAG_fold_constants && string->IsConstant() && index->IsConstant()) {
4416e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    HConstant* c_string = HConstant::cast(string);
4417e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    HConstant* c_index = HConstant::cast(index);
4418e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    if (c_string->HasStringValue() && c_index->HasInteger32Value()) {
4419e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      Handle<String> s = c_string->StringValue();
4420e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      int32_t i = c_index->Integer32Value();
4421e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK_LE(0, i);
4422e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org      DCHECK_LT(i, s->length());
4423e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org      return H_CONSTANT_INT(s->Get(i));
4424e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org    }
4425e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  }
4426e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org  return new(zone) HSeqStringGetChar(encoding, string, index);
4427e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org}
4428e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
4429e8412be858dc48afaec4959e42c5932f71a7f29bmachenbach@chromium.org
4430fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org#undef H_CONSTANT_INT
44310ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry#undef H_CONSTANT_DOUBLE
44320ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
44330ad885c06ff6a0d68bc9ad75629f7ddfaa6860b9erikcorry
4434f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& HBitwise::PrintDataTo(OStream& os) const {  // NOLINT
4435f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << Token::Name(op_) << " ";
4436f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return HBitwiseBinaryOperation::PrintDataTo(os);
4437ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
4438ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
4439ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
4440ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.orgvoid HPhi::SimplifyConstantInputs() {
4441ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  // Convert constant inputs to integers when all uses are truncating.
4442ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  // This must happen before representation inference takes place.
4443ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  if (!CheckUsesForFlag(kTruncatingToInt32)) return;
4444ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
4445ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    if (!OperandAt(i)->IsConstant()) return;
4446ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
4447ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  HGraph* graph = block()->graph();
4448ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
4449ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    HConstant* operand = HConstant::cast(OperandAt(i));
4450ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    if (operand->HasInteger32Value()) {
4451ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      continue;
4452ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    } else if (operand->HasDoubleValue()) {
4453ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      HConstant* integer_input =
4454d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org          HConstant::New(graph->zone(), graph->GetInvalidContext(),
4455d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org                         DoubleToInt32(operand->DoubleValue()));
4456ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      integer_input->InsertAfter(operand);
4457ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      SetOperandAt(i, integer_input);
4458594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    } else if (operand->HasBooleanValue()) {
4459594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org      SetOperandAt(i, operand->BooleanValue() ? graph->GetConstant1()
4460594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org                                              : graph->GetConstant0());
4461594006017e46d82ed7146611dc12c20e3c509c7ddanno@chromium.org    } else if (operand->ImmortalImmovable()) {
4462ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      SetOperandAt(i, graph->GetConstant0());
4463ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    }
4464ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
4465ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  // Overwrite observed input representations because they are likely Tagged.
4466ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
4467ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    HValue* use = it.value();
4468ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    if (use->IsBinaryOperation()) {
4469ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org      HBinaryOperation::cast(use)->set_observed_input_representation(
4470fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org          it.index(), Representation::Smi());
4471ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org    }
4472ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org  }
4473ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org}
4474ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
4475ca29dd85fa02449d17188f5a6ff9a7cdf2ad9680danno@chromium.org
44761510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HPhi::InferRepresentation(HInferRepresentationPhase* h_infer) {
4477e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(CheckFlag(kFlexibleRepresentation));
447857ff881caeb2e15b46ac9e4dfc00e378f7c5f929ulan@chromium.org  Representation new_rep = RepresentationFromInputs();
4479fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  UpdateRepresentation(new_rep, h_infer, "inputs");
4480fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  new_rep = RepresentationFromUses();
4481fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  UpdateRepresentation(new_rep, h_infer, "uses");
4482fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  new_rep = RepresentationFromUseRequirements();
4483fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  UpdateRepresentation(new_rep, h_infer, "use requirements");
4484fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
4485fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
4486fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
4487fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.orgRepresentation HPhi::RepresentationFromInputs() {
4488d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  Representation r = Representation::None();
44892c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
4490d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org    r = r.generalize(OperandAt(i)->KnownOptimalRepresentation());
44912c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org  }
4492d4be0f0c0edfc0a0b46e745055c3dc497c0ffcb5verwaest@chromium.org  return r;
44932c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org}
44942c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
44952c067b150f65db3e076b6b5a813e7f6f2492f770rossberg@chromium.org
4496b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org// Returns a representation if all uses agree on the same representation.
4497b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org// Integer32 is also returned when some uses are Smi but others are Integer32.
4498b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.orgRepresentation HValue::RepresentationFromUseRequirements() {
4499b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  Representation rep = Representation::None();
4500fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
45012c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org    // Ignore the use requirement from never run code
4502dd6d9eedcac6e3b5adfb7702649ac32def9c3585mvstanton@chromium.org    if (it.value()->block()->IsUnreachable()) continue;
45032c9426bdda5e95459527292063d885c98180cb0fjkummerow@chromium.org
4504fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    // We check for observed_input_representation elsewhere.
4505fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    Representation use_rep =
4506fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org        it.value()->RequiredInputRepresentation(it.index());
4507b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    if (rep.IsNone()) {
4508b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org      rep = use_rep;
4509fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      continue;
4510fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
4511b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    if (use_rep.IsNone() || rep.Equals(use_rep)) continue;
4512b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    if (rep.generalize(use_rep).IsInteger32()) {
4513b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org      rep = Representation::Integer32();
4514fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org      continue;
4515fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org    }
4516b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org    return Representation::None();
4517fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org  }
4518b752d4061aaeb7d6a6ec368607871789d54b0207dslomov@chromium.org  return rep;
4519fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org}
4520fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
4521fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org
4522fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgbool HValue::HasNonSmiUse() {
4523fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
4524fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    // We check for observed_input_representation elsewhere.
4525fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    Representation use_rep =
4526fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org        it.value()->RequiredInputRepresentation(it.index());
4527d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    if (!use_rep.IsNone() &&
4528d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        !use_rep.IsSmi() &&
4529d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org        !use_rep.IsTagged()) {
4530d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      return true;
4531d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    }
4532fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  }
4533fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return false;
4534fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org}
4535fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
4536fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org
4537a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org// Node-specific verification code is only included in debug mode.
4538a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#ifdef DEBUG
4539a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4540378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid HPhi::Verify() {
4541e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(OperandCount() == block()->predecessors()->length());
4542a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  for (int i = 0; i < OperandCount(); ++i) {
4543a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HValue* value = OperandAt(i);
4544a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* defining_block = value->block();
4545a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org    HBasicBlock* predecessor_block = block()->predecessors()->at(i);
4546e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(defining_block == predecessor_block ||
4547a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org           defining_block->Dominates(predecessor_block));
4548a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  }
4549a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4550a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4551a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4552378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid HSimulate::Verify() {
4553a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction::Verify();
4554e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(HasAstId() || next()->IsEnterInlined());
4555a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4556a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4557a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
45581510d58cbcf57c82a10e7d390bfe21a7ae68ba43mstarzinger@chromium.orgvoid HCheckHeapObject::Verify() {
4559a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction::Verify();
4560e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(HasNoUses());
4561a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4562a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4563a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
45641f410f9a9c4fbd4270749af64b477df87b753158mstarzinger@chromium.orgvoid HCheckValue::Verify() {
4565a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org  HInstruction::Verify();
4566e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(HasNoUses());
4567a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org}
4568a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4569a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org#endif
4570a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
4571a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4572a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgHObjectAccess HObjectAccess::ForFixedArrayHeader(int offset) {
4573e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(offset >= 0);
4574e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(offset < FixedArray::kHeaderSize);
4575a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (offset == FixedArray::kLengthOffset) return ForFixedArrayLength();
4576a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  return HObjectAccess(kInobject, offset);
4577a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4578a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4579a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
45800a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.orgHObjectAccess HObjectAccess::ForMapAndOffset(Handle<Map> map, int offset,
4581fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    Representation representation) {
4582e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(offset >= 0);
4583a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  Portion portion = kInobject;
4584a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4585a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (offset == JSObject::kElementsOffset) {
4586a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    portion = kElementsPointer;
4587a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  } else if (offset == JSObject::kMapOffset) {
4588a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    portion = kMaps;
4589a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
45900a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  bool existing_inobject_property = true;
45910a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  if (!map.is_null()) {
45920a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    existing_inobject_property = (offset <
45930a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org        map->instance_size() - map->unused_property_fields() * kPointerSize);
45940a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  }
45950a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  return HObjectAccess(portion, offset, representation, Handle<String>::null(),
45960a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org                       false, existing_inobject_property);
4597a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4598a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4599a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4600afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.orgHObjectAccess HObjectAccess::ForAllocationSiteOffset(int offset) {
4601afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  switch (offset) {
4602afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    case AllocationSite::kTransitionInfoOffset:
4603afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      return HObjectAccess(kInobject, offset, Representation::Tagged());
4604afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    case AllocationSite::kNestedSiteOffset:
4605afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      return HObjectAccess(kInobject, offset, Representation::Tagged());
46064ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org    case AllocationSite::kPretenureDataOffset:
4607afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      return HObjectAccess(kInobject, offset, Representation::Smi());
46084ddd2f1981d343a2efe6609a3e0ce6b9c80b6ed9machenbach@chromium.org    case AllocationSite::kPretenureCreateCountOffset:
4609afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      return HObjectAccess(kInobject, offset, Representation::Smi());
4610afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    case AllocationSite::kDependentCodeOffset:
4611afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      return HObjectAccess(kInobject, offset, Representation::Tagged());
4612afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    case AllocationSite::kWeakNextOffset:
4613afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      return HObjectAccess(kInobject, offset, Representation::Tagged());
4614afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org    default:
4615afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      UNREACHABLE();
4616afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  }
4617afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org  return HObjectAccess(kInobject, offset);
4618afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org}
4619afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org
4620afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org
4621662436e7b124b3535773535c671c53db322070b5verwaest@chromium.orgHObjectAccess HObjectAccess::ForContextSlot(int index) {
4622e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(index >= 0);
4623662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  Portion portion = kInobject;
4624662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  int offset = Context::kHeaderSize + index * kPointerSize;
4625e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK_EQ(offset, Context::SlotOffset(index) + kHeapObjectTag);
4626662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org  return HObjectAccess(portion, offset, Representation::Tagged());
4627662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org}
4628662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
4629662436e7b124b3535773535c671c53db322070b5verwaest@chromium.org
4630a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.orgHObjectAccess HObjectAccess::ForJSArrayOffset(int offset) {
4631e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(offset >= 0);
4632a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  Portion portion = kInobject;
4633a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4634a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (offset == JSObject::kElementsOffset) {
4635a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    portion = kElementsPointer;
4636a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  } else if (offset == JSArray::kLengthOffset) {
4637a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    portion = kArrayLengths;
4638a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  } else if (offset == JSObject::kMapOffset) {
4639a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    portion = kMaps;
4640a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
4641fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org  return HObjectAccess(portion, offset);
4642a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4643a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4644a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4645fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.orgHObjectAccess HObjectAccess::ForBackingStoreOffset(int offset,
4646fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org    Representation representation) {
4647e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(offset >= 0);
46480a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org  return HObjectAccess(kBackingStore, offset, representation,
46490a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org                       Handle<String>::null(), false, false);
4650a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4651a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4652a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4653e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.orgHObjectAccess HObjectAccess::ForField(Handle<Map> map, int index,
4654e2a8937454723a720c81acc3f9e4162b18999b43machenbach@chromium.org                                      Representation representation,
46550a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org                                      Handle<String> name) {
4656a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  if (index < 0) {
4657a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    // Negative property indices are in-object properties, indexed
4658a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    // from the end of the fixed part of the object.
4659a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    int offset = (index * kPointerSize) + map->instance_size();
46600a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    return HObjectAccess(kInobject, offset, representation, name, false, true);
4661a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  } else {
4662a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    // Non-negative property indices are in the properties array.
4663a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    int offset = (index * kPointerSize) + FixedArray::kHeaderSize;
46640a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org    return HObjectAccess(kBackingStore, offset, representation, name,
46650a7303680fa9f3dc3945763aaa7c5a3859a7f855machenbach@chromium.org                         false, false);
4666a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
4667a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4668a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4669a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4670e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.orgHObjectAccess HObjectAccess::ForCellPayload(Isolate* isolate) {
46715e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org  return HObjectAccess(kInobject, Cell::kValueOffset, Representation::Tagged(),
46725e57059e20217fd540b60c237d326414afe2171emachenbach@chromium.org                       isolate->factory()->cell_value_string());
4673e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org}
4674e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
4675e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org
4676f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.orgvoid HObjectAccess::SetGVNFlags(HValue *instr, PropertyAccessType access_type) {
4677a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  // set the appropriate GVN flags for a given load or store instruction
4678f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org  if (access_type == STORE) {
4679a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    // track dominating allocations in order to eliminate write barriers
4680f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    instr->SetDependsOnFlag(::v8::internal::kNewSpacePromotion);
4681a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    instr->SetFlag(HValue::kTrackSideEffectDominators);
4682a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  } else {
4683a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    // try to GVN loads, but don't hoist above map changes
4684a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    instr->SetFlag(HValue::kUseGVN);
4685f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org    instr->SetDependsOnFlag(::v8::internal::kMaps);
4686a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
4687a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4688a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  switch (portion()) {
4689a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    case kArrayLengths:
4690f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4691f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kArrayLengths);
4692f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4693f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kArrayLengths);
4694f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4695a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4696d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    case kStringLengths:
4697f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4698f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kStringLengths);
4699f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4700f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kStringLengths);
4701f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4702d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      break;
4703a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    case kInobject:
4704f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4705f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kInobjectFields);
4706f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4707f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kInobjectFields);
4708f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4709a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4710a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    case kDouble:
4711f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4712f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kDoubleFields);
4713f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4714f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kDoubleFields);
4715f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4716a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4717a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    case kBackingStore:
4718f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4719f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kBackingStoreFields);
4720f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4721f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kBackingStoreFields);
4722f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4723a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4724a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    case kElementsPointer:
4725f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4726f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kElementsPointer);
4727f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4728f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kElementsPointer);
4729f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4730a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4731a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org    case kMaps:
4732f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4733f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kMaps);
4734f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4735f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kMaps);
4736f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4737a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4738d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org    case kExternalMemory:
4739f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      if (access_type == STORE) {
4740f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetChangesFlag(::v8::internal::kExternalMemory);
4741f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      } else {
4742f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org        instr->SetDependsOnFlag(::v8::internal::kExternalMemory);
4743f5a24546072ecdbbd6372c85c42157e01e913561titzer@chromium.org      }
4744d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      break;
4745a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
4746a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4747a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4748a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4749f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.orgOStream& operator<<(OStream& os, const HObjectAccess& access) {
4750f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  os << ".";
4751a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4752f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  switch (access.portion()) {
4753f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kArrayLengths:
4754f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kStringLengths:
4755f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "%length";
4756a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4757f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kElementsPointer:
4758f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "%elements";
4759a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4760f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kMaps:
4761f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "%map";
4762a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4763f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kDouble:  // fall through
4764f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kInobject:
4765f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (!access.name().is_null()) {
4766f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        os << Handle<String>::cast(access.name())->ToCString().get();
4767afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      }
4768f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "[in-object]";
4769a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4770f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kBackingStore:
4771f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      if (!access.name().is_null()) {
4772f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org        os << Handle<String>::cast(access.name())->ToCString().get();
4773afbdadc5f06365a7889e7c1c1fdb7dbf596cce68machenbach@chromium.org      }
4774f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "[backing-store]";
4775a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org      break;
4776f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org    case HObjectAccess::kExternalMemory:
4777f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org      os << "[external-memory]";
4778d3c42109e5b85232d19beab8deeb24bdcbbf07f9danno@chromium.org      break;
4779a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org  }
4780a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4781f15d0cdbef11a212e108432465f014a7d3c3aa12machenbach@chromium.org  return os << "@" << access.offset();
4782a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org}
4783a53e8e03bcb23716d1025de362626f90f00da892svenpanne@chromium.org
4784a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org} }  // namespace v8::internal
4785