DFGAbstractInterpreter should not claim Int52 arithmetic creates Int52s
https://bugs.webkit.org/show_bug.cgi?id=132446
Reviewed by Mark Hahnenberg.
Source/JavaScriptCore:
Basically any arithmetic operation can turn an Int52 into an Int32 or vice-versa, and
our modeling of Int52Rep nodes is such that they can have either Int32 or Int52 type
to indicate a bound on the value. This is useful for knowing, for example, that
Int52Rep(Int32:) returns a value that cannot be outside the Int32 range. Also,
ValueRep(Int52Rep:) uses this to determine whether it may return a double or an int.
But this means that all arithmetic operations must be careful to note that they may
turn Int32 inputs into an Int52 output or vice-versa, as these new tests show.
* dfg/DFGAbstractInterpreterInlines.h:
(JSC::DFG::AbstractInterpreter<AbstractStateType>::executeEffects):
* dfg/DFGByteCodeParser.cpp:
(JSC::DFG::ByteCodeParser::makeSafe):
* tests/stress/int52-ai-add-then-filter-int32.js: Added.
(foo):
* tests/stress/int52-ai-mul-and-clean-neg-zero-then-filter-int32.js: Added.
(foo):
* tests/stress/int52-ai-mul-then-filter-int32-directly.js: Added.
(foo):
* tests/stress/int52-ai-mul-then-filter-int32.js: Added.
(foo):
* tests/stress/int52-ai-neg-then-filter-int32.js: Added.
(foo):
* tests/stress/int52-ai-sub-then-filter-int32.js: Added.
(foo):
Tools:
Test the FTL by default now that it's enabled by default.
* Scripts/run-javascriptcore-tests:
git-svn-id: http://svn.webkit.org/repository/webkit/trunk@168172 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h b/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
index 39c06ab..a8f404a 100644
--- a/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
+++ b/Source/JavaScriptCore/dfg/DFGAbstractInterpreterInlines.h
@@ -376,7 +376,7 @@
break;
}
}
- forNode(node).setType(SpecInt52);
+ forNode(node).setType(SpecMachineInt);
if (!forNode(node->child1()).isType(SpecInt32)
|| !forNode(node->child2()).isType(SpecInt32))
node->setCanExit(true);
@@ -431,7 +431,7 @@
break;
}
}
- forNode(node).setType(SpecInt52);
+ forNode(node).setType(SpecMachineInt);
if (!forNode(node->child1()).isType(SpecInt32)
|| !forNode(node->child2()).isType(SpecInt32))
node->setCanExit(true);
@@ -489,7 +489,7 @@
break;
}
}
- forNode(node).setType(SpecInt52);
+ forNode(node).setType(SpecMachineInt);
if (m_state.forNode(node->child1()).couldBeType(SpecInt52))
node->setCanExit(true);
if (shouldCheckNegativeZero(node->arithMode()))
@@ -545,7 +545,7 @@
break;
}
}
- forNode(node).setType(SpecInt52);
+ forNode(node).setType(SpecMachineInt);
node->setCanExit(true);
break;
case DoubleRepUse: