summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGNode.cpp
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2016-05-24 08:28:08 +0000
commita4e969f4965059196ca948db781e52f7cfebf19e (patch)
tree6ca352808c8fdc52006a0f33f6ae3c593b23867d /Source/JavaScriptCore/dfg/DFGNode.cpp
parent41386e9cb918eed93b3f13648cbef387e371e451 (diff)
downloadWebKitGtk-tarball-a4e969f4965059196ca948db781e52f7cfebf19e.tar.gz
webkitgtk-2.12.3webkitgtk-2.12.3
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGNode.cpp')
-rw-r--r--Source/JavaScriptCore/dfg/DFGNode.cpp155
1 files changed, 152 insertions, 3 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGNode.cpp b/Source/JavaScriptCore/dfg/DFGNode.cpp
index bf43f29a4..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
@@ -30,9 +30,40 @@
#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);
@@ -44,7 +75,6 @@ bool Node::hasVariableAccessData(Graph& graph)
case Phi:
return graph.m_form != SSA;
case GetLocal:
- case GetArgument:
case SetLocal:
case SetArgument:
case Flush:
@@ -55,6 +85,119 @@ bool Node::hasVariableAccessData(Graph& graph)
}
}
+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 {
@@ -74,6 +217,9 @@ void printInternal(PrintStream& out, SwitchKind kind)
case SwitchString:
out.print("SwitchString");
return;
+ case SwitchCell:
+ out.print("SwitchCell");
+ return;
}
RELEASE_ASSERT_NOT_REACHED();
}
@@ -85,7 +231,10 @@ void printInternal(PrintStream& out, Node* node)
return;
}
out.print("@", node->index());
- out.print(AbbreviatedSpeculationDump(node->prediction()));
+ if (node->hasDoubleResult())
+ out.print("<Double>");
+ else if (node->hasInt52Result())
+ out.print("<Int52>");
}
} // namespace WTF