Reviewers: titzer,

https://codereview.chromium.org/523633002/diff/1/test/cctest/compiler/test-js-typed-lowering.cc
File test/cctest/compiler/test-js-typed-lowering.cc (right):

https://codereview.chromium.org/523633002/diff/1/test/cctest/compiler/test-js-typed-lowering.cc#newcode761
test/cctest/compiler/test-js-typed-lowering.cc:761:
IrOpcode::kJSToBoolean == r->opcode());
On 2014/08/29 15:49:38, titzer wrote:
Can you use a value use here?

Done.

https://codereview.chromium.org/523633002/diff/1/test/cctest/compiler/test-js-typed-lowering.cc#newcode1189
test/cctest/compiler/test-js-typed-lowering.cc:1189:
IrOpcode::kJSToBoolean == r->opcode());
On 2014/08/29 15:49:38, titzer wrote:
Can you push this condition down into the branch below?

Done.

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 (+25, -10 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..08f65f08757d88195dba679003c015154fb8aeb0 100644
--- a/test/cctest/compiler/test-js-typed-lowering.cc
+++ b/test/cctest/compiler/test-js-typed-lowering.cc
@@ -755,9 +755,19 @@ TEST(UnaryNot) {
   Operator* opnot = R.javascript.UnaryNot();

   for (size_t i = 0; i < arraysize(kJSTypes); i++) {
-    Node* r = R.ReduceUnop(opnot, kJSTypes[i]);
+    Node* orig = R.Unop(opnot, R.Parameter(kJSTypes[i]));
+    Node* 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(IrOpcode::kBooleanNot, use->InputAt(0)->opcode());
+
+    if (r == orig && orig->opcode() == IrOpcode::kJSToBoolean) {
+ // The original node was turned into a ToBoolean, which has an effect.
+      CHECK_EQ(IrOpcode::kJSToBoolean, r->opcode());
+    } else {
+      // effect should have been removed from this node.
+      CHECK_EQ(IrOpcode::kBooleanNot, r->opcode());
+    }
   }
 }

@@ -1184,16 +1194,16 @@ 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_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.
+      CHECK_EQ(IrOpcode::kJSToBoolean, r->opcode());
       R.CheckEffectInput(R.start(), orig);
       R.CheckEffectInput(orig, effect_use);
     } else {
       // effect should have been removed from this node.
+      CHECK_EQ(IrOpcode::kBooleanNot, r->opcode());
       R.CheckEffectInput(R.start(), 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