diff options
author | Konstantin Tokarev <annulen@yandex.ru> | 2016-08-25 19:20:41 +0300 |
---|---|---|
committer | Konstantin Tokarev <annulen@yandex.ru> | 2017-02-02 12:30:55 +0000 |
commit | 6882a04fb36642862b11efe514251d32070c3d65 (patch) | |
tree | b7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/dfg/DFGNode.cpp | |
parent | ab6df191029eeeb0b0f16f127d553265659f739e (diff) | |
download | qtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz |
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f
Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGNode.cpp')
-rw-r--r-- | Source/JavaScriptCore/dfg/DFGNode.cpp | 192 |
1 files changed, 189 insertions, 3 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGNode.cpp b/Source/JavaScriptCore/dfg/DFGNode.cpp index 51720f8ac..6a9853424 100644 --- a/Source/JavaScriptCore/dfg/DFGNode.cpp +++ b/Source/JavaScriptCore/dfg/DFGNode.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2013 Apple Inc. All rights reserved. + * Copyright (C) 2013, 2014 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -28,27 +28,213 @@ #if ENABLE(DFG_JIT) +#include "DFGGraph.h" #include "DFGNodeAllocator.h" +#include "DFGPromotedHeapLocation.h" +#include "JSCInlines.h" namespace JSC { namespace DFG { +bool MultiPutByOffsetData::writesStructures() const +{ + for (unsigned i = variants.size(); i--;) { + if (variants[i].writesStructures()) + return true; + } + return false; +} + +bool MultiPutByOffsetData::reallocatesStorage() const +{ + for (unsigned i = variants.size(); i--;) { + if (variants[i].reallocatesStorage()) + return true; + } + return false; +} + +void BranchTarget::dump(PrintStream& out) const +{ + if (!block) + return; + + out.print(*block); + + if (count == count) // If the count is not NaN, then print it. + out.print("/w:", count); +} + unsigned Node::index() const { return NodeAllocator::allocatorOf(this)->indexOf(this); } +bool Node::hasVariableAccessData(Graph& graph) +{ + switch (op()) { + case Phi: + return graph.m_form != SSA; + case GetLocal: + case SetLocal: + case SetArgument: + case Flush: + case PhantomLocal: + return true; + default: + return false; + } +} + +void Node::remove() +{ + ASSERT(!(flags() & NodeHasVarArgs)); + + children = children.justChecks(); + + setOpAndDefaultFlags(Check); +} + +void Node::convertToIdentity() +{ + RELEASE_ASSERT(child1()); + RELEASE_ASSERT(!child2()); + NodeFlags result = canonicalResultRepresentation(this->result()); + setOpAndDefaultFlags(Identity); + setResult(result); +} + +void Node::convertToIdentityOn(Node* child) +{ + children.reset(); + child1() = child->defaultEdge(); + NodeFlags output = canonicalResultRepresentation(this->result()); + NodeFlags input = canonicalResultRepresentation(child->result()); + if (output == input) { + setOpAndDefaultFlags(Identity); + setResult(output); + return; + } + switch (output) { + case NodeResultDouble: + setOpAndDefaultFlags(DoubleRep); + switch (input) { + case NodeResultInt52: + child1().setUseKind(Int52RepUse); + return; + case NodeResultJS: + child1().setUseKind(NumberUse); + return; + default: + RELEASE_ASSERT_NOT_REACHED(); + return; + } + case NodeResultInt52: + setOpAndDefaultFlags(Int52Rep); + switch (input) { + case NodeResultDouble: + child1().setUseKind(DoubleRepMachineIntUse); + return; + case NodeResultJS: + child1().setUseKind(MachineIntUse); + return; + default: + RELEASE_ASSERT_NOT_REACHED(); + return; + } + case NodeResultJS: + setOpAndDefaultFlags(ValueRep); + switch (input) { + case NodeResultDouble: + child1().setUseKind(DoubleRepUse); + return; + case NodeResultInt52: + child1().setUseKind(Int52RepUse); + return; + default: + RELEASE_ASSERT_NOT_REACHED(); + return; + } + default: + RELEASE_ASSERT_NOT_REACHED(); + return; + } +} + +void Node::convertToPutHint(const PromotedLocationDescriptor& descriptor, Node* base, Node* value) +{ + m_op = PutHint; + m_opInfo = descriptor.imm1().m_value; + m_opInfo2 = descriptor.imm2().m_value; + child1() = base->defaultEdge(); + child2() = value->defaultEdge(); + child3() = Edge(); +} + +void Node::convertToPutStructureHint(Node* structure) +{ + ASSERT(m_op == PutStructure); + ASSERT(structure->castConstant<Structure*>() == transition()->next); + convertToPutHint(StructurePLoc, child1().node(), structure); +} + +void Node::convertToPutByOffsetHint() +{ + ASSERT(m_op == PutByOffset); + convertToPutHint( + PromotedLocationDescriptor(NamedPropertyPLoc, storageAccessData().identifierNumber), + child2().node(), child3().node()); +} + +void Node::convertToPutClosureVarHint() +{ + ASSERT(m_op == PutClosureVar); + convertToPutHint( + PromotedLocationDescriptor(ClosureVarPLoc, scopeOffset().offset()), + child1().node(), child2().node()); +} + +PromotedLocationDescriptor Node::promotedLocationDescriptor() +{ + return PromotedLocationDescriptor(static_cast<PromotedLocationKind>(m_opInfo), m_opInfo2); +} + } } // namespace JSC::DFG namespace WTF { -void printInternal(PrintStream& out, JSC::DFG::Node* node) +using namespace JSC; +using namespace JSC::DFG; + +void printInternal(PrintStream& out, SwitchKind kind) +{ + switch (kind) { + case SwitchImm: + out.print("SwitchImm"); + return; + case SwitchChar: + out.print("SwitchChar"); + return; + case SwitchString: + out.print("SwitchString"); + return; + case SwitchCell: + out.print("SwitchCell"); + return; + } + RELEASE_ASSERT_NOT_REACHED(); +} + +void printInternal(PrintStream& out, Node* node) { if (!node) { out.print("-"); return; } out.print("@", node->index()); - out.print(JSC::AbbreviatedSpeculationDump(node->prediction())); + if (node->hasDoubleResult()) + out.print("<Double>"); + else if (node->hasInt52Result()) + out.print("<Int52>"); } } // namespace WTF |