summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGNode.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/JavaScriptCore/dfg/DFGNode.cpp
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-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.cpp192
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