Merge V8 5.3.332.45. DO NOT MERGE
Test: Manual
FPIIM-449
Change-Id: Id3254828b068abdea3cb10442e0172a8c9a98e03
(cherry picked from commit 13e2dadd00298019ed862f2b2fc5068bba730bcf)
diff --git a/src/compiler/simplified-operator-reducer.cc b/src/compiler/simplified-operator-reducer.cc
index 6fbf16e..5db9dfb 100644
--- a/src/compiler/simplified-operator-reducer.cc
+++ b/src/compiler/simplified-operator-reducer.cc
@@ -16,8 +16,27 @@
namespace internal {
namespace compiler {
-SimplifiedOperatorReducer::SimplifiedOperatorReducer(JSGraph* jsgraph)
- : jsgraph_(jsgraph), type_cache_(TypeCache::Get()) {}
+namespace {
+
+Decision DecideObjectIsSmi(Node* const input) {
+ NumberMatcher m(input);
+ if (m.HasValue()) {
+ return IsSmiDouble(m.Value()) ? Decision::kTrue : Decision::kFalse;
+ }
+ if (m.IsAllocate()) return Decision::kFalse;
+ if (m.IsChangeBitToTagged()) return Decision::kFalse;
+ if (m.IsChangeInt31ToTaggedSigned()) return Decision::kTrue;
+ if (m.IsHeapConstant()) return Decision::kFalse;
+ return Decision::kUnknown;
+}
+
+} // namespace
+
+SimplifiedOperatorReducer::SimplifiedOperatorReducer(Editor* editor,
+ JSGraph* jsgraph)
+ : AdvancedReducer(editor),
+ jsgraph_(jsgraph),
+ type_cache_(TypeCache::Get()) {}
SimplifiedOperatorReducer::~SimplifiedOperatorReducer() {}
@@ -60,7 +79,8 @@
}
break;
}
- case IrOpcode::kChangeTaggedToFloat64: {
+ case IrOpcode::kChangeTaggedToFloat64:
+ case IrOpcode::kTruncateTaggedToFloat64: {
NumberMatcher m(node->InputAt(0));
if (m.HasValue()) return ReplaceFloat64(m.Value());
if (m.IsChangeFloat64ToTagged()) return Replace(m.node()->InputAt(0));
@@ -109,6 +129,39 @@
}
break;
}
+ case IrOpcode::kCheckTaggedPointer: {
+ Node* const input = node->InputAt(0);
+ if (DecideObjectIsSmi(input) == Decision::kFalse) {
+ ReplaceWithValue(node, input);
+ return Replace(input);
+ }
+ break;
+ }
+ case IrOpcode::kCheckTaggedSigned: {
+ Node* const input = node->InputAt(0);
+ if (DecideObjectIsSmi(input) == Decision::kTrue) {
+ ReplaceWithValue(node, input);
+ return Replace(input);
+ }
+ break;
+ }
+ case IrOpcode::kObjectIsSmi: {
+ Node* const input = node->InputAt(0);
+ switch (DecideObjectIsSmi(input)) {
+ case Decision::kTrue:
+ return ReplaceBoolean(true);
+ case Decision::kFalse:
+ return ReplaceBoolean(false);
+ case Decision::kUnknown:
+ break;
+ }
+ break;
+ }
+ case IrOpcode::kNumberAbs: {
+ NumberMatcher m(node->InputAt(0));
+ if (m.HasValue()) return ReplaceNumber(std::fabs(m.Value()));
+ break;
+ }
case IrOpcode::kNumberCeil:
case IrOpcode::kNumberFloor:
case IrOpcode::kNumberRound:
@@ -164,6 +217,9 @@
return Changed(node);
}
+Reduction SimplifiedOperatorReducer::ReplaceBoolean(bool value) {
+ return Replace(jsgraph()->BooleanConstant(value));
+}
Reduction SimplifiedOperatorReducer::ReplaceFloat64(double value) {
return Replace(jsgraph()->Float64Constant(value));