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.h127
1 files changed, 89 insertions, 38 deletions
diff --git a/Source/JavaScriptCore/dfg/DFGNodeFlags.h b/Source/JavaScriptCore/dfg/DFGNodeFlags.h
index d68f0587b..4abaddf24 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
@@ -23,10 +23,7 @@
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
-#ifndef DFGNodeFlags_h
-#define DFGNodeFlags_h
-
-#include <wtf/Platform.h>
+#pragma once
#if ENABLE(DFG_JIT)
@@ -40,35 +37,40 @@ namespace JSC { namespace DFG {
#define NodeResultMask 0x0007
#define NodeResultJS 0x0001
#define NodeResultNumber 0x0002
-#define NodeResultInt32 0x0003
-#define NodeResultInt52 0x0004
-#define NodeResultBoolean 0x0005
-#define NodeResultStorage 0x0006
+#define NodeResultDouble 0x0003
+#define NodeResultInt32 0x0004
+#define NodeResultInt52 0x0005
+#define NodeResultBoolean 0x0006
+#define NodeResultStorage 0x0007
#define NodeMustGenerate 0x0008 // set on nodes that have side effects, and may not trivially be removed by DCE.
#define NodeHasVarArgs 0x0010
-#define NodeClobbersWorld 0x0020
-#define NodeMightClobber 0x0040
-
-#define NodeBehaviorMask 0x0180
-#define NodeMayOverflow 0x0080
-#define NodeMayNegZero 0x0100
+
+#define NodeBehaviorMask 0x07e0
+#define NodeMayHaveDoubleResult 0x0020
+#define NodeMayOverflowInt52 0x0040
+#define NodeMayOverflowInt32InBaseline 0x0080
+#define NodeMayOverflowInt32InDFG 0x0100
+#define NodeMayNegZeroInBaseline 0x0200
+#define NodeMayNegZeroInDFG 0x0400
+#define NodeMayHaveNonNumberResult 0x0800
+#define NodeMayHaveNonIntResult (NodeMayHaveDoubleResult | NodeMayHaveNonNumberResult)
-#define NodeBytecodeBackPropMask 0x1E00
-#define NodeBytecodeUseBottom 0x0000
-#define NodeBytecodeUsesAsNumber 0x0200 // The result of this computation may be used in a context that observes fractional, or bigger-than-int32, results.
-#define NodeBytecodeNeedsNegZero 0x0400 // The result of this computation may be used in a context that observes -0.
-#define NodeBytecodeUsesAsOther 0x0800 // 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 0x1000 // The result of this computation is known to be used in a context that prefers, but does not require, integer values.
+#define NodeBytecodeBackPropMask 0x1f000
+#define NodeBytecodeUseBottom 0x00000
+#define NodeBytecodeUsesAsNumber 0x01000 // The result of this computation may be used in a context that observes fractional, or bigger-than-int32, results.
+#define NodeBytecodeNeedsNegZero 0x02000 // The result of this computation may be used in a context that observes -0.
+#define NodeBytecodeUsesAsOther 0x04000 // 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 0x08000 // The result of this computation is known to be used in a context that prefers, but does not require, integer values.
+#define NodeBytecodeUsesAsArrayIndex 0x10000 // 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 | NodeBytecodeBackPropMask)
-#define NodeDoesNotExit 0x2000 // This flag is negated to make it natural for the default to be that a node does exit.
-
-#define NodeRelevantToOSR 0x4000
+#define NodeIsFlushed 0x20000 // Computed by CPSRethreadingPhase, will tell you which local nodes are backwards-reachable from a Flush.
-#define NodeIsStaticConstant 0x8000 // Used only by the parser, to determine if a constant arose statically and hence could be folded at parse-time.
+#define NodeMiscFlag1 0x40000
+#define NodeMiscFlag2 0x80000
typedef uint32_t NodeFlags;
@@ -87,41 +89,90 @@ static inline bool bytecodeCanIgnoreNegativeZero(NodeFlags flags)
return !(flags & NodeBytecodeNeedsNegZero);
}
-static inline bool nodeMayOverflow(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 !!(flags & NodeMayOverflowInt52);
+}
+
+static inline bool nodeMayOverflowInt32(NodeFlags flags, RareCaseProfilingSource source)
{
- return !!(flags & NodeMayOverflow);
+ 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 nodeMayNegZero(NodeFlags flags)
+static inline bool nodeMayNegZero(NodeFlags flags, RareCaseProfilingSource source)
{
- return !!(flags & NodeMayNegZero);
+ 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 nodeCanSpeculateInt32(NodeFlags flags)
+static inline bool nodeCanSpeculateInt32(NodeFlags flags, RareCaseProfilingSource source)
{
- if (nodeMayOverflow(flags))
+ if (nodeMayOverflowInt32(flags, source))
return !bytecodeUsesAsNumber(flags);
- if (nodeMayNegZero(flags))
+ if (nodeMayNegZero(flags, source))
return bytecodeCanIgnoreNegativeZero(flags);
return true;
}
-static inline bool nodeCanSpeculateInt52(NodeFlags flags)
+static inline bool nodeCanSpeculateInt52(NodeFlags flags, RareCaseProfilingSource source)
{
- if (nodeMayNegZero(flags))
+ 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);
} } // namespace JSC::DFG
#endif // ENABLE(DFG_JIT)
-
-#endif // DFGNodeFlags_h
-