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