diff options
author | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
---|---|---|
committer | Oswald Buddenhagen <oswald.buddenhagen@qt.io> | 2017-05-30 12:48:17 +0200 |
commit | 881da28418d380042aa95a97f0cbd42560a64f7c (patch) | |
tree | a794dff3274695e99c651902dde93d934ea7a5af /Source/JavaScriptCore/dfg/DFGNode.cpp | |
parent | 7e104c57a70fdf551bb3d22a5d637cdcbc69dbea (diff) | |
parent | 0fcedcd17cc00d3dd44c718b3cb36c1033319671 (diff) | |
download | qtwebkit-881da28418d380042aa95a97f0cbd42560a64f7c.tar.gz |
Merge 'wip/next' into dev
Change-Id: Iff9ee5e23bb326c4371ec8ed81d56f2f05d680e9
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 |