Improve ==/=== comparison in Hydrogen for monomorphic maps
authordanno@chromium.org <danno@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 18 Dec 2013 17:18:23 +0000 (17:18 +0000)
committerdanno@chromium.org <danno@chromium.org@ce2b1a6d-e550-0410-aec6-3dcde31c8c00>
Wed, 18 Dec 2013 17:18:23 +0000 (17:18 +0000)
R=titzer@chromium.org

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

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@18357 ce2b1a6d-e550-0410-aec6-3dcde31c8c00

src/hydrogen.cc

index b3549f5..339a623 100644 (file)
@@ -9193,10 +9193,11 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
   if (combined_type->Is(Type::Receiver())) {
     if (Token::IsEqualityOp(op)) {
       // Can we get away with map check and not instance type check?
+      HValue* operand_to_check =
+          left->block()->block_id() < right->block()->block_id() ? left : right;
       if (combined_type->IsClass()) {
         Handle<Map> map = combined_type->AsClass();
-        AddCheckMap(left, map);
-        AddCheckMap(right, map);
+        AddCheckMap(operand_to_check, map);
         HCompareObjectEqAndBranch* result =
             New<HCompareObjectEqAndBranch>(left, right);
         if (FLAG_emit_opt_code_positions) {
@@ -9205,10 +9206,9 @@ HControlInstruction* HOptimizedGraphBuilder::BuildCompareInstruction(
         }
         return result;
       } else {
-        BuildCheckHeapObject(left);
-        Add<HCheckInstanceType>(left, HCheckInstanceType::IS_SPEC_OBJECT);
-        BuildCheckHeapObject(right);
-        Add<HCheckInstanceType>(right, HCheckInstanceType::IS_SPEC_OBJECT);
+        BuildCheckHeapObject(operand_to_check);
+        Add<HCheckInstanceType>(operand_to_check,
+                                HCheckInstanceType::IS_SPEC_OBJECT);
         HCompareObjectEqAndBranch* result =
             New<HCompareObjectEqAndBranch>(left, right);
         return result;