From 5f29f9bd8ee446a921db3728c11e6216197d04e3 Mon Sep 17 00:00:00 2001 From: "fschneider@chromium.org" Date: Thu, 12 May 2011 14:56:56 +0000 Subject: [PATCH] Don't use environment values at certain deoptimize-instructions. If a HDeoptimize does not cut away parts of the control-flow-graph we don't need to insert uses to correctly elimiate dead phis since the full function is visible to the optimizing compiler. This is a small improvement of the change r7221 which fixed a problem when deoptimizing on never executed case-clauses. Review URL: http://codereview.chromium.org/7012010 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@7877 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/hydrogen-instructions.h | 5 +++++ src/hydrogen.cc | 15 +++++++++------ src/hydrogen.h | 6 +++--- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h index cca4150e1..03ff00751 100644 --- a/src/hydrogen-instructions.h +++ b/src/hydrogen-instructions.h @@ -862,6 +862,11 @@ class HDeoptimize: public HControlInstruction { DECLARE_CONCRETE_INSTRUCTION(Deoptimize) + enum UseEnvironment { + kNoUses, + kUseAll + }; + protected: virtual void InternalSetOperandAt(int index, HValue* value) { values_[index] = value; diff --git a/src/hydrogen.cc b/src/hydrogen.cc index 614113aac..97d7c8394 100644 --- a/src/hydrogen.cc +++ b/src/hydrogen.cc @@ -115,12 +115,13 @@ void HBasicBlock::AddInstruction(HInstruction* instr) { } -HDeoptimize* HBasicBlock::CreateDeoptimize() { +HDeoptimize* HBasicBlock::CreateDeoptimize( + HDeoptimize::UseEnvironment has_uses) { ASSERT(HasEnvironment()); - HEnvironment* environment = last_environment(); + if (has_uses == HDeoptimize::kNoUses) return new(zone()) HDeoptimize(0); + HEnvironment* environment = last_environment(); HDeoptimize* instr = new(zone()) HDeoptimize(environment->length()); - for (int i = 0; i < environment->length(); i++) { HValue* val = environment->values()->at(i); instr->AddEnvironmentValue(val); @@ -2490,7 +2491,9 @@ void HGraphBuilder::VisitSwitchStatement(SwitchStatement* stmt) { // Unconditionally deoptimize on the first non-smi compare. clause->RecordTypeFeedback(oracle()); if (!clause->IsSmiCompare()) { - current_block()->FinishExitWithDeoptimization(); + // Finish with deoptimize and add uses of enviroment values to + // account for invisible uses. + current_block()->FinishExitWithDeoptimization(HDeoptimize::kUseAll); set_current_block(NULL); break; } @@ -3237,7 +3240,7 @@ void HGraphBuilder::HandlePolymorphicStoreNamedField(Assignment* expr, // know about and do not want to handle ones we've never seen. Otherwise // use a generic IC. if (count == types->length() && FLAG_deoptimize_uncommon_cases) { - current_block()->FinishExitWithDeoptimization(); + current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); } else { HInstruction* instr = BuildStoreNamedGeneric(object, name, value); instr->set_position(expr->position()); @@ -3916,7 +3919,7 @@ void HGraphBuilder::HandlePolymorphicCallNamed(Call* expr, // know about and do not want to handle ones we've never seen. Otherwise // use a generic IC. if (count == types->length() && FLAG_deoptimize_uncommon_cases) { - current_block()->FinishExitWithDeoptimization(); + current_block()->FinishExitWithDeoptimization(HDeoptimize::kNoUses); } else { HValue* context = environment()->LookupContext(); HCallNamed* call = new(zone()) HCallNamed(context, name, argument_count); diff --git a/src/hydrogen.h b/src/hydrogen.h index 326f82a65..fb9b117a6 100644 --- a/src/hydrogen.h +++ b/src/hydrogen.h @@ -125,8 +125,8 @@ class HBasicBlock: public ZoneObject { void AddSimulate(int id) { AddInstruction(CreateSimulate(id)); } void AssignCommonDominator(HBasicBlock* other); - void FinishExitWithDeoptimization() { - FinishExit(CreateDeoptimize()); + void FinishExitWithDeoptimization(HDeoptimize::UseEnvironment has_uses) { + FinishExit(CreateDeoptimize(has_uses)); } // Add the inlined function exit sequence, adding an HLeaveInlined @@ -153,7 +153,7 @@ class HBasicBlock: public ZoneObject { void AddDominatedBlock(HBasicBlock* block); HSimulate* CreateSimulate(int id); - HDeoptimize* CreateDeoptimize(); + HDeoptimize* CreateDeoptimize(HDeoptimize::UseEnvironment has_uses); int block_id_; HGraph* graph_; -- 2.34.1