Reviewers: titzer,

Description:
Fix typed lowering of JSUnaryNot to work with graph reducer.

[email protected]
TEST=cctest/test-js-typed-lowering/UnaryNot[Effects]

Please review this at https://codereview.chromium.org/523633002/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+15, -9 lines):
  M src/compiler/js-generic-lowering.cc
  M src/compiler/js-typed-lowering.cc
  M test/cctest/compiler/test-js-typed-lowering.cc


Index: src/compiler/js-generic-lowering.cc
diff --git a/src/compiler/js-generic-lowering.cc b/src/compiler/js-generic-lowering.cc index b8cf80389ca7d3c9b150da0e528fa8b93b36104a..49574f8754eea4e8c9286240173be40a82df1937 100644
--- a/src/compiler/js-generic-lowering.cc
+++ b/src/compiler/js-generic-lowering.cc
@@ -286,7 +286,6 @@ REPLACE_RUNTIME_CALL(JSCreateGlobalContext, Runtime::kAbort)
     UNIMPLEMENTED();                               \
     return node;                                   \
   }
-REPLACE_UNIMPLEMENTED(JSToString)
 REPLACE_UNIMPLEMENTED(JSToName)
 REPLACE_UNIMPLEMENTED(JSYield)
 REPLACE_UNIMPLEMENTED(JSDebugger)
@@ -411,6 +410,12 @@ Node* JSGenericLowering::LowerJSToBoolean(Node* node) {
 }


+Node* JSGenericLowering::LowerJSToString(Node* node) {
+  ReplaceWithBuiltinCall(node, Builtins::TO_STRING, 1);
+  return node;
+}
+
+
 Node* JSGenericLowering::LowerJSToObject(Node* node) {
   ReplaceWithBuiltinCall(node, Builtins::TO_OBJECT, 1);
   return node;
Index: src/compiler/js-typed-lowering.cc
diff --git a/src/compiler/js-typed-lowering.cc b/src/compiler/js-typed-lowering.cc index 64663df9aec4d553d9ba8ae2fd018c08ec728b55..0cf53373f637645ce74f73cdd5a367e23c495d08 100644
--- a/src/compiler/js-typed-lowering.cc
+++ b/src/compiler/js-typed-lowering.cc
@@ -587,19 +587,19 @@ Reduction JSTypedLowering::Reduce(Node* node) {
       Reduction result = ReduceJSToBooleanInput(node->InputAt(0));
       Node* value;
       if (result.Changed()) {
-        // !x => BooleanNot(x)
+        // JSUnaryNot(x) => BooleanNot(x)
         value =
graph()->NewNode(simplified()->BooleanNot(), result.replacement());
         NodeProperties::ReplaceWithValue(node, value);
         return Changed(value);
       } else {
-        // !x => BooleanNot(JSToBoolean(x))
+        // JSUnaryNot(x) => BooleanNot(JSToBoolean(x))
         value = graph()->NewNode(simplified()->BooleanNot(), node);
         node->set_op(javascript()->ToBoolean());
         NodeProperties::ReplaceWithValue(node, value, node);
         // Note: ReplaceUses() smashes all uses, so smash it back here.
         value->ReplaceInput(0, node);
-        return ReplaceWith(value);
+        return Changed(node);
       }
     }
     case IrOpcode::kJSToBoolean:
Index: test/cctest/compiler/test-js-typed-lowering.cc
diff --git a/test/cctest/compiler/test-js-typed-lowering.cc b/test/cctest/compiler/test-js-typed-lowering.cc index 6e9cb30933b82be10551c2fe409b92a5de2a9a61..58f222f8b06c96101e59ad19081a6c400de88198 100644
--- a/test/cctest/compiler/test-js-typed-lowering.cc
+++ b/test/cctest/compiler/test-js-typed-lowering.cc
@@ -757,7 +757,8 @@ TEST(UnaryNot) {
   for (size_t i = 0; i < arraysize(kJSTypes); i++) {
     Node* r = R.ReduceUnop(opnot, kJSTypes[i]);
// TODO(titzer): test will break if/when js-typed-lowering constant folds.
-    CHECK_EQ(IrOpcode::kBooleanNot, r->opcode());
+    CHECK(IrOpcode::kBooleanNot == r->opcode() ||
+          IrOpcode::kJSToBoolean == r->opcode());
   }
 }

@@ -1184,11 +1185,11 @@ TEST(UnaryNotEffects) {
     Node* value_use = R.graph.NewNode(R.common.Return(), orig);
     Node* r = R.reduce(orig);
// TODO(titzer): test will break if/when js-typed-lowering constant folds.
-    CHECK_EQ(IrOpcode::kBooleanNot, r->opcode());
-
-    CHECK_EQ(r, value_use->InputAt(0));
+    CHECK(IrOpcode::kBooleanNot == r->opcode() ||
+          IrOpcode::kJSToBoolean == r->opcode());
+    CHECK_EQ(IrOpcode::kBooleanNot, value_use->InputAt(0)->opcode());

- if (r->InputAt(0) == orig && orig->opcode() == IrOpcode::kJSToBoolean) {
+    if (r == orig && orig->opcode() == IrOpcode::kJSToBoolean) {
// The original node was turned into a ToBoolean, which has an effect.
       R.CheckEffectInput(R.start(), orig);
       R.CheckEffectInput(orig, effect_use);


--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to