summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/dfg/DFGNodeFlags.h
diff options
context:
space:
mode:
Diffstat (limited to 'Source/JavaScriptCore/dfg/DFGNodeFlags.h')
-rw-r--r--Source/JavaScriptCore/dfg/DFGNodeFlags.h152
1 files changed, 110 insertions, 42 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGNodeFlags.h b/Source/JavaScriptCore/dfg/DFGNodeFlags.h
index adb34bf66..626b9bb2b 100644
--- a/Source/JavaScriptCore/dfg/DFGNodeFlags.h
+++ b/Source/JavaScriptCore/dfg/DFGNodeFlags.h
@@ -1,5 +1,5 @@
/*
- * Copyright (C) 2012, 2013 Apple Inc. All rights reserved.
+ * Copyright (C) 2012-2015 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -26,8 +26,6 @@
#ifndef DFGNodeFlags_h
#define DFGNodeFlags_h
-#include <wtf/Platform.h>
-
#if ENABLE(DFG_JIT)
#include <wtf/PrintStream.h>
@@ -37,71 +35,141 @@ namespace JSC { namespace DFG {
// Entries in the NodeType enum (below) are composed of an id, a result type (possibly none)
// and some additional informative flags (must generate, is constant, etc).
-#define NodeResultMask 0x7
-#define NodeResultJS 0x1
-#define NodeResultNumber 0x2
-#define NodeResultInt32 0x3
-#define NodeResultBoolean 0x4
-#define NodeResultStorage 0x5
-
-#define NodeMustGenerate 0x08 // set on nodes that have side effects, and may not trivially be removed by DCE.
-#define NodeHasVarArgs 0x10
-#define NodeClobbersWorld 0x20
-#define NodeMightClobber 0x40
+#define NodeResultMask 0x0007
+#define NodeResultJS 0x0001
+#define NodeResultNumber 0x0002
+#define NodeResultDouble 0x0003
+#define NodeResultInt32 0x0004
+#define NodeResultInt52 0x0005
+#define NodeResultBoolean 0x0006
+#define NodeResultStorage 0x0007
-#define NodeBehaviorMask 0x180
-#define NodeMayOverflow 0x080
-#define NodeMayNegZero 0x100
+#define NodeMustGenerate 0x0008 // set on nodes that have side effects, and may not trivially be removed by DCE.
+#define NodeHasVarArgs 0x0010
+
+#define NodeBehaviorMask 0x07e0
+#define NodeMayHaveNonIntResult 0x0020
+#define NodeMayOverflowInt52 0x0040
+#define NodeMayOverflowInt32InBaseline 0x0080
+#define NodeMayOverflowInt32InDFG 0x0100
+#define NodeMayNegZeroInBaseline 0x0200
+#define NodeMayNegZeroInDFG 0x0400
-#define NodeBackPropMask 0x1E00
-#define NodeUseBottom 0x0000
-#define NodeUsedAsNumber 0x0200 // The result of this computation may be used in a context that observes fractional, or bigger-than-int32, results.
-#define NodeNeedsNegZero 0x0400 // The result of this computation may be used in a context that observes -0.
-#define NodeUsedAsOther 0x0800 // The result of this computation may be used in a context that distinguishes between NaN and other things (like undefined).
-#define NodeUsedAsValue (NodeUsedAsNumber | NodeNeedsNegZero | NodeUsedAsOther)
-#define NodeUsedAsInt 0x1000 // The result of this computation is known to be used in a context that prefers, but does not require, integer values.
+#define NodeBytecodeBackPropMask 0xf800
+#define NodeBytecodeUseBottom 0x0000
+#define NodeBytecodeUsesAsNumber 0x0800 // The result of this computation may be used in a context that observes fractional, or bigger-than-int32, results.
+#define NodeBytecodeNeedsNegZero 0x1000 // The result of this computation may be used in a context that observes -0.
+#define NodeBytecodeUsesAsOther 0x2000 // The result of this computation may be used in a context that distinguishes between NaN and other things (like undefined).
+#define NodeBytecodeUsesAsValue (NodeBytecodeUsesAsNumber | NodeBytecodeNeedsNegZero | NodeBytecodeUsesAsOther)
+#define NodeBytecodeUsesAsInt 0x4000 // The result of this computation is known to be used in a context that prefers, but does not require, integer values.
+#define NodeBytecodeUsesAsArrayIndex 0x8000 // The result of this computation is known to be used in a context that strongly prefers integer values, to the point that we should avoid using doubles if at all possible.
-#define NodeArithFlagsMask (NodeBehaviorMask | NodeBackPropMask)
+#define NodeArithFlagsMask (NodeBehaviorMask | NodeBytecodeBackPropMask)
-#define NodeDoesNotExit 0x2000 // This flag is negated to make it natural for the default to be that a node does exit.
+#define NodeIsFlushed 0x10000 // Computed by CPSRethreadingPhase, will tell you which local nodes are backwards-reachable from a Flush.
-#define NodeRelevantToOSR 0x4000
-
-#define NodeExitsForward 0x8000
+#define NodeMiscFlag1 0x20000
+#define NodeMiscFlag2 0x40000
+#define NodeMiscFlag3 0x80000
typedef uint32_t NodeFlags;
-static inline bool nodeUsedAsNumber(NodeFlags flags)
+static inline bool bytecodeUsesAsNumber(NodeFlags flags)
+{
+ return !!(flags & NodeBytecodeUsesAsNumber);
+}
+
+static inline bool bytecodeCanTruncateInteger(NodeFlags flags)
+{
+ return !bytecodeUsesAsNumber(flags);
+}
+
+static inline bool bytecodeCanIgnoreNegativeZero(NodeFlags flags)
{
- return !!(flags & NodeUsedAsNumber);
+ return !(flags & NodeBytecodeNeedsNegZero);
}
-static inline bool nodeCanTruncateInteger(NodeFlags flags)
+enum RareCaseProfilingSource {
+ BaselineRareCase, // Comes from slow case counting in the baseline JIT.
+ DFGRareCase, // Comes from OSR exit profiles.
+ AllRareCases
+};
+
+static inline bool nodeMayOverflowInt52(NodeFlags flags, RareCaseProfilingSource)
{
- return !nodeUsedAsNumber(flags);
+ return !!(flags & NodeMayOverflowInt52);
}
-static inline bool nodeCanIgnoreNegativeZero(NodeFlags flags)
+static inline bool nodeMayOverflowInt32(NodeFlags flags, RareCaseProfilingSource source)
{
- return !(flags & NodeNeedsNegZero);
+ NodeFlags mask = 0;
+ switch (source) {
+ case BaselineRareCase:
+ mask = NodeMayOverflowInt32InBaseline;
+ break;
+ case DFGRareCase:
+ mask = NodeMayOverflowInt32InDFG;
+ break;
+ case AllRareCases:
+ mask = NodeMayOverflowInt32InBaseline | NodeMayOverflowInt32InDFG;
+ break;
+ }
+ return !!(flags & mask);
}
-static inline bool nodeMayOverflow(NodeFlags flags)
+static inline bool nodeMayNegZero(NodeFlags flags, RareCaseProfilingSource source)
{
- return !!(flags & NodeMayOverflow);
+ NodeFlags mask = 0;
+ switch (source) {
+ case BaselineRareCase:
+ mask = NodeMayNegZeroInBaseline;
+ break;
+ case DFGRareCase:
+ mask = NodeMayNegZeroInDFG;
+ break;
+ case AllRareCases:
+ mask = NodeMayNegZeroInBaseline | NodeMayNegZeroInDFG;
+ break;
+ }
+ return !!(flags & mask);
}
-static inline bool nodeCanSpeculateInteger(NodeFlags flags)
+static inline bool nodeCanSpeculateInt32(NodeFlags flags, RareCaseProfilingSource source)
{
- if (flags & NodeMayOverflow)
- return !nodeUsedAsNumber(flags);
+ if (nodeMayOverflowInt32(flags, source))
+ return !bytecodeUsesAsNumber(flags);
+
+ if (nodeMayNegZero(flags, source))
+ return bytecodeCanIgnoreNegativeZero(flags);
- if (flags & NodeMayNegZero)
- return nodeCanIgnoreNegativeZero(flags);
+ return true;
+}
+
+static inline bool nodeCanSpeculateInt52(NodeFlags flags, RareCaseProfilingSource source)
+{
+ if (nodeMayOverflowInt52(flags, source))
+ return false;
+
+ if (nodeMayNegZero(flags, source))
+ return bytecodeCanIgnoreNegativeZero(flags);
return true;
}
+// FIXME: Get rid of this.
+// https://bugs.webkit.org/show_bug.cgi?id=131689
+static inline NodeFlags canonicalResultRepresentation(NodeFlags flags)
+{
+ switch (flags) {
+ case NodeResultDouble:
+ case NodeResultInt52:
+ case NodeResultStorage:
+ return flags;
+ default:
+ return NodeResultJS;
+ }
+}
+
void dumpNodeFlags(PrintStream&, NodeFlags);
MAKE_PRINT_ADAPTOR(NodeFlagsDump, NodeFlags, dumpNodeFlags);