From: svenpanne@chromium.org Date: Thu, 22 Aug 2013 06:44:34 +0000 (+0000) Subject: Cleaned up nil comparisons in Hydrogen. X-Git-Tag: upstream/4.7.83~12886 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=40f81949d31d3a878908f9e37ed8a3a2ebc1d30a;p=platform%2Fupstream%2Fv8.git Cleaned up nil comparisons in Hydrogen. This consists basically of 2 parts: * Restructured BuildCompareNil to make the logic behind it clearer. Note that it is intentionally written in a quite stylized way. * Replaced a usesless IfBuilder by a plain HInstruction, removing some empty blocks. R=danno@chromium.org Review URL: https://codereview.chromium.org/22305004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@16266 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 1fc6f08..d77147b 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -1745,22 +1745,35 @@ void HGraphBuilder::BuildCompareNil( int position, HIfContinuation* continuation) { IfBuilder if_nil(this, position); - bool needs_or = false; + bool some_case_handled = false; + bool some_case_missing = false; + if (type->Maybe(Type::Null())) { - if (needs_or) if_nil.Or(); + if (some_case_handled) if_nil.Or(); if_nil.If(value, graph()->GetConstantNull()); - needs_or = true; + some_case_handled = true; + } else { + some_case_missing = true; } + if (type->Maybe(Type::Undefined())) { - if (needs_or) if_nil.Or(); + if (some_case_handled) if_nil.Or(); if_nil.If(value, graph()->GetConstantUndefined()); - needs_or = true; + some_case_handled = true; + } else { + some_case_missing = true; } + if (type->Maybe(Type::Undetectable())) { - if (needs_or) if_nil.Or(); + if (some_case_handled) if_nil.Or(); if_nil.If(value); + some_case_handled = true; } else { + some_case_missing = true; + } + + if (some_case_missing) { if_nil.Then(); if_nil.Else(); if (type->NumClasses() == 1) { @@ -8209,21 +8222,23 @@ void HOptimizedGraphBuilder::HandleLiteralCompareNil(CompareOperation* expr, ASSERT(expr->op() == Token::EQ || expr->op() == Token::EQ_STRICT); CHECK_ALIVE(VisitForValue(sub_expr)); HValue* value = Pop(); - HIfContinuation continuation; if (expr->op() == Token::EQ_STRICT) { - IfBuilder if_nil(this); - if_nil.If( - value, (nil == kNullValue) ? graph()->GetConstantNull() - : graph()->GetConstantUndefined()); - if_nil.Then(); - if_nil.Else(); - if_nil.CaptureContinuation(&continuation); + HConstant* nil_constant = nil == kNullValue + ? graph()->GetConstantNull() + : graph()->GetConstantUndefined(); + HCompareObjectEqAndBranch* instr = + New(value, nil_constant); + instr->set_position(expr->position()); + return ast_context()->ReturnControl(instr, expr->id()); + } else { + ASSERT_EQ(Token::EQ, expr->op()); + Handle type = expr->combined_type()->Is(Type::None()) + ? handle(Type::Any(), isolate_) + : expr->combined_type(); + HIfContinuation continuation; + BuildCompareNil(value, type, expr->position(), &continuation); return ast_context()->ReturnContinuation(&continuation, expr->id()); } - Handle type = expr->combined_type()->Is(Type::None()) - ? handle(Type::Any(), isolate_) : expr->combined_type(); - BuildCompareNil(value, type, expr->position(), &continuation); - return ast_context()->ReturnContinuation(&continuation, expr->id()); }