[turbofan] Add PlainPrimitiveToNumber simplified operator.
authorbmeurer <bmeurer@chromium.org>
Tue, 13 Jan 2015 11:02:40 +0000 (03:02 -0800)
committerCommit bot <commit-bot@chromium.org>
Tue, 13 Jan 2015 11:02:57 +0000 (11:02 +0000)
TEST=unittests

Review URL: https://codereview.chromium.org/845333002

Cr-Commit-Position: refs/heads/master@{#26038}

src/compiler/opcodes.h
src/compiler/simplified-lowering.cc
src/compiler/simplified-operator.cc
src/compiler/simplified-operator.h
src/compiler/typer.cc
src/compiler/verifier.cc
test/unittests/compiler/simplified-operator-unittest.cc

index bda44d3..a4c42cb 100644 (file)
   V(NumberModulus)            \
   V(NumberToInt32)            \
   V(NumberToUint32)           \
+  V(PlainPrimitiveToNumber)   \
   V(ReferenceEqual)           \
   V(StringEqual)              \
   V(StringLessThan)           \
index 1461709..16a1278 100644 (file)
@@ -745,6 +745,22 @@ class RepresentationSelector {
         }
         break;
       }
+      case IrOpcode::kPlainPrimitiveToNumber: {
+        VisitUnop(node, kMachAnyTagged, kTypeNumber | kRepTagged);
+        if (lower()) {
+          // PlainPrimitiveToNumber(x) => Call(ToNumberStub, x, no-context)
+          Operator::Properties properties = node->op()->properties();
+          Callable callable = CodeFactory::ToNumber(jsgraph_->isolate());
+          CallDescriptor::Flags flags = CallDescriptor::kNoFlags;
+          CallDescriptor* desc = Linkage::GetStubCallDescriptor(
+              callable.descriptor(), 0, flags, properties, jsgraph_->zone());
+          node->set_op(jsgraph_->common()->Call(desc));
+          node->InsertInput(jsgraph_->zone(), 0,
+                            +jsgraph_->HeapConstant(callable.code()));
+          node->AppendInput(jsgraph_->zone(), jsgraph_->NoContextConstant());
+        }
+        break;
+      }
       case IrOpcode::kReferenceEqual: {
         VisitBinop(node, kMachAnyTagged, kRepBit);
         if (lower()) node->set_op(lowering->machine()->WordEqual());
index 0018d7c..5aea64b 100644 (file)
@@ -157,35 +157,36 @@ const ElementAccess& ElementAccessOf(const Operator* op) {
 }
 
 
-#define PURE_OP_LIST(V)                                \
-  V(AnyToBoolean, Operator::kNoProperties, 1)          \
-  V(BooleanNot, Operator::kNoProperties, 1)            \
-  V(BooleanToNumber, Operator::kNoProperties, 1)       \
-  V(NumberEqual, Operator::kCommutative, 2)            \
-  V(NumberLessThan, Operator::kNoProperties, 2)        \
-  V(NumberLessThanOrEqual, Operator::kNoProperties, 2) \
-  V(NumberAdd, Operator::kCommutative, 2)              \
-  V(NumberSubtract, Operator::kNoProperties, 2)        \
-  V(NumberMultiply, Operator::kCommutative, 2)         \
-  V(NumberDivide, Operator::kNoProperties, 2)          \
-  V(NumberModulus, Operator::kNoProperties, 2)         \
-  V(NumberToInt32, Operator::kNoProperties, 1)         \
-  V(NumberToUint32, Operator::kNoProperties, 1)        \
-  V(StringEqual, Operator::kCommutative, 2)            \
-  V(StringLessThan, Operator::kNoProperties, 2)        \
-  V(StringLessThanOrEqual, Operator::kNoProperties, 2) \
-  V(StringAdd, Operator::kNoProperties, 2)             \
-  V(ChangeTaggedToInt32, Operator::kNoProperties, 1)   \
-  V(ChangeTaggedToUint32, Operator::kNoProperties, 1)  \
-  V(ChangeTaggedToFloat64, Operator::kNoProperties, 1) \
-  V(ChangeInt32ToTagged, Operator::kNoProperties, 1)   \
-  V(ChangeUint32ToTagged, Operator::kNoProperties, 1)  \
-  V(ChangeFloat64ToTagged, Operator::kNoProperties, 1) \
-  V(ChangeBitToBool, Operator::kNoProperties, 1)       \
-  V(ChangeBoolToBit, Operator::kNoProperties, 1)       \
-  V(ChangeWord32ToBit, Operator::kNoProperties, 1)     \
-  V(ChangeWord64ToBit, Operator::kNoProperties, 1)     \
-  V(ObjectIsSmi, Operator::kNoProperties, 1)           \
+#define PURE_OP_LIST(V)                                 \
+  V(AnyToBoolean, Operator::kNoProperties, 1)           \
+  V(BooleanNot, Operator::kNoProperties, 1)             \
+  V(BooleanToNumber, Operator::kNoProperties, 1)        \
+  V(NumberEqual, Operator::kCommutative, 2)             \
+  V(NumberLessThan, Operator::kNoProperties, 2)         \
+  V(NumberLessThanOrEqual, Operator::kNoProperties, 2)  \
+  V(NumberAdd, Operator::kCommutative, 2)               \
+  V(NumberSubtract, Operator::kNoProperties, 2)         \
+  V(NumberMultiply, Operator::kCommutative, 2)          \
+  V(NumberDivide, Operator::kNoProperties, 2)           \
+  V(NumberModulus, Operator::kNoProperties, 2)          \
+  V(NumberToInt32, Operator::kNoProperties, 1)          \
+  V(NumberToUint32, Operator::kNoProperties, 1)         \
+  V(PlainPrimitiveToNumber, Operator::kNoProperties, 1) \
+  V(StringEqual, Operator::kCommutative, 2)             \
+  V(StringLessThan, Operator::kNoProperties, 2)         \
+  V(StringLessThanOrEqual, Operator::kNoProperties, 2)  \
+  V(StringAdd, Operator::kNoProperties, 2)              \
+  V(ChangeTaggedToInt32, Operator::kNoProperties, 1)    \
+  V(ChangeTaggedToUint32, Operator::kNoProperties, 1)   \
+  V(ChangeTaggedToFloat64, Operator::kNoProperties, 1)  \
+  V(ChangeInt32ToTagged, Operator::kNoProperties, 1)    \
+  V(ChangeUint32ToTagged, Operator::kNoProperties, 1)   \
+  V(ChangeFloat64ToTagged, Operator::kNoProperties, 1)  \
+  V(ChangeBitToBool, Operator::kNoProperties, 1)        \
+  V(ChangeBoolToBit, Operator::kNoProperties, 1)        \
+  V(ChangeWord32ToBit, Operator::kNoProperties, 1)      \
+  V(ChangeWord64ToBit, Operator::kNoProperties, 1)      \
+  V(ObjectIsSmi, Operator::kNoProperties, 1)            \
   V(ObjectIsNonNegativeSmi, Operator::kNoProperties, 1)
 
 
index cdaa064..5b57cdd 100644 (file)
@@ -144,6 +144,8 @@ class SimplifiedOperatorBuilder FINAL {
   const Operator* NumberToInt32();
   const Operator* NumberToUint32();
 
+  const Operator* PlainPrimitiveToNumber();
+
   const Operator* ReferenceEqual(Type* type);
 
   const Operator* StringEqual();
index 88a3666..24e93e1 100644 (file)
@@ -1462,7 +1462,7 @@ Bounds Typer::Visitor::TypeBooleanNot(Node* node) {
 
 
 Bounds Typer::Visitor::TypeBooleanToNumber(Node* node) {
-  return Bounds(Type::None(zone()), typer_->zero_or_one);
+  return TypeUnaryOp(node, ToNumber);
 }
 
 
@@ -1516,6 +1516,11 @@ Bounds Typer::Visitor::TypeNumberToUint32(Node* node) {
 }
 
 
+Bounds Typer::Visitor::TypePlainPrimitiveToNumber(Node* node) {
+  return TypeUnaryOp(node, ToNumber);
+}
+
+
 Bounds Typer::Visitor::TypeReferenceEqual(Node* node) {
   return Bounds(Type::None(zone()), Type::Boolean(zone()));
 }
index 1916b99..188ee3e 100644 (file)
@@ -540,6 +540,11 @@ void Verifier::Visitor::Pre(Node* node) {
       CheckValueInputIs(node, 0, Type::Number());
       CheckUpperIs(node, Type::Unsigned32());
       break;
+    case IrOpcode::kPlainPrimitiveToNumber:
+      // PlainPrimitive -> Number
+      CheckValueInputIs(node, 0, Type::PlainPrimitive());
+      CheckUpperIs(node, Type::Number());
+      break;
     case IrOpcode::kStringEqual:
     case IrOpcode::kStringLessThan:
     case IrOpcode::kStringLessThanOrEqual:
index f02d3df..11858b4 100644 (file)
@@ -51,6 +51,7 @@ const PureOperator kPureOperators[] = {
     PURE(NumberModulus, Operator::kNoProperties, 2),
     PURE(NumberToInt32, Operator::kNoProperties, 1),
     PURE(NumberToUint32, Operator::kNoProperties, 1),
+    PURE(PlainPrimitiveToNumber, Operator::kNoProperties, 1),
     PURE(StringEqual, Operator::kCommutative, 2),
     PURE(StringLessThan, Operator::kNoProperties, 2),
     PURE(StringLessThanOrEqual, Operator::kNoProperties, 2),